使用pyodbc从SQL检索数据

Mik*_*ike 37 python sql sql-server pyodbc

我试图使用pyodbc从SQL服务器检索数据,并使用Python将其打印在表中.但是,我似乎只能检索列名称和数据类型以及类似的东西,而不是列的每一行中的实际数据值.

基本上我试图复制一个Excel表格,检索服务器数据并将其显示在表格中.我连接到服务器没有任何问题,只是我似乎无法找到进入表中的实际数据.

这是我的代码示例:

import pyodbc
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=SQLSRV01;DATABASE=DATABASE;UID=USER;PWD=PASSWORD')
cursor = cnxn.cursor()

cursor.execute("SELECT * FROM sys.tables")
tables = cursor.fetchall()
#cursor.execute("SELECT WORK_ORDER.TYPE,WORK_ORDER.STATUS, WORK_ORDER.BASE_ID, WORK_ORDER.LOT_ID FROM WORK_ORDER")

for row in cursor.columns(table='WORK_ORDER'):
    print row.column_name
    for field in row:
        print field
Run Code Online (Sandbox Code Playgroud)

然而这样做的结果只是给我的东西,如表名,列名,有的整数和"无的之类的东西是不感兴趣的我:

STATUS_EFF_DATE
DATABASE
dbo
WORK_ORDER
STATUS_EFF_DATE
93
datetime
23
16
3
None
0
None
None
9
3
None
80
NO
61
Run Code Online (Sandbox Code Playgroud)

所以我不确定在哪里可以获得填充表格的值.它应该在table ='WORK_ORDER'中,但是它可以在不同的表名下吗?有没有办法打印我刚丢失的数据?

任何建议或意见将不胜感激.

Chr*_*vey 56

你真是太近了!

import pyodbc
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=SQLSRV01;DATABASE=DATABASE;UID=USER;PWD=PASSWORD')
cursor = cnxn.cursor()

cursor.execute("SELECT WORK_ORDER.TYPE,WORK_ORDER.STATUS, WORK_ORDER.BASE_ID, WORK_ORDER.LOT_ID FROM WORK_ORDER")
for row in cursor.fetchall():
    print row
Run Code Online (Sandbox Code Playgroud)

("columns()"函数收集有关指定表中列的元数据,而不是实际数据).


小智 11

您可以尝试使用 Pandas 来检索信息并将其作为数据框获取

import pyodbc as cnn
import pandas as pd

cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=SQLSRV01;DATABASE=DATABASE;UID=USER;PWD=PASSWORD')

# Copy to Clipboard for paste in Excel sheet
def copia (argumento):
    df=pd.DataFrame(argumento)
    df.to_clipboard(index=False,header=True)


tableResult = pd.read_sql("SELECT * FROM YOURTABLE", cnxn) 

# Copy to Clipboard
copia(tableResult)

# Or create a Excel file with the results
df=pd.DataFrame(tableResult)
df.to_excel("FileExample.xlsx",sheet_name='Results')
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助!干杯!


小智 9

为了接收存储在表中的实际数据,您应该使用fetch ...()函数之一或使用游标作为迭代器(即"for cursor in cursor"...).这在文档中描述:

cursor.execute("select user_id, user_name from users where user_id < 100")
rows = cursor.fetchall()
for row in rows:
    print row.user_id, row.user_name
Run Code Online (Sandbox Code Playgroud)


Gra*_*non 6

只需这样做:

import pandas as pd
import pyodbc

cnxn = pyodbc.connect("Driver={SQL Server}\
                    ;Server=SERVER_NAME\
                    ;Database=DATABASE_NAME\
                    ;Trusted_Connection=yes")

df = pd.read_sql("SELECT * FROM myTableName", cnxn) 
df.head()
Run Code Online (Sandbox Code Playgroud)