58

我正在尝试使用 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

然而,这样做的结果只是给了我诸如表名、列名、一些整数和“无”之类的东西,我不感兴趣:

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

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

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

4

8 回答 8

86

你是如此接近!

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

(“columns()”函数收集有关命名表中列的元数据,而不是实际数据)。

于 2012-07-12T12:28:23.300 回答
14

为了接收存储在表中的实际数据,您应该使用 fetch...() 函数之一或将游标用作迭代器(即“for row 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
于 2012-07-12T12:00:34.603 回答
13

您可以尝试使用 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')

我希望这有帮助!干杯!

于 2019-04-04T20:22:52.523 回答
3

不要使用 pyodbc 库,而是使用 pypyodbc 库......这对我有用。

import pypyodbc

conn = pypyodbc.connect("DRIVER={SQL Server};"
                    "SERVER=server;"
                    "DATABASE=database;"
                    "Trusted_Connection=yes;")

cursor = conn.cursor()
cursor.execute('SELECT * FROM [table]')

for row in cursor:
    print('row = %r' % (row,))
于 2018-07-06T23:18:35.407 回答
3

只需这样做:

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()
于 2020-12-23T12:38:04.807 回答
1

赞成的答案对我不起作用,它通过如下编辑连接线来修复(用逗号替换分号并删除那些引号):

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
于 2019-03-08T04:39:05.403 回答
1
import pyodbc
conn = pyodbc.connect('Driver={SQL Server};'
                  'Server=db-server;'
                  'Database=db;'
                  'Trusted_Connection=yes;')
sql = "SELECT * FROM [mytable] "
cursor.execute(sql)
for r in cursor:
    print(r)
于 2019-11-12T13:31:35.907 回答
1

为什么pyodbc你可以尝试使用pymssql. 有关更多信息,请点击此链接:https ://stackoverflow.com/a/70445445/8614314 。

import pandas as pd
import pymssql

con = pymssql.connect(<conncetion to the server and db>)
cursor = con.cursor()
query = "<Your query>"
cursor.execute(query)
df = pd.read_sql(query, con)
con.close()
于 2021-12-22T07:23:10.807 回答