Получение данных из SQL с помощью pyodbc
Я пытаюсь извлечь данные с SQL-сервера с помощью pyodbc и распечатать его в таблице с помощью 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', но может ли оно находиться под другим именем таблицы? Есть ли способ распечатать данные, которые я просто отсутствую?
Приветствуются любые советы или предложения.
Ответы
Ответ 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
(функция "columns()" собирает метаданные о столбцах в названной таблице, а не фактические данные).
Ответ 2
Чтобы получить фактические данные, хранящиеся в таблице, вы должны использовать одну из функций fetch...() или использовать курсор в качестве итератора (т.е. "для строки в курсоре"...). Это описано в документации:
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
Ответ 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,))
Ответ 4
Ответ с поправкой не работает для меня, он был исправлен путем редактирования строки подключения следующим образом (замените точку с запятой на кому, а также удалите эти кавычки):
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
Ответ 5
Вы можете попробовать использовать 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')
Надеюсь, это поможет! Ура!