Как вернуть список из SQL-запроса, используя pyodbc? - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь выполнить запрос на выборку для извлечения данных из SQL Server, используя pyodbc в Python 2.7. Я хочу, чтобы данные были возвращены в списке. Код, который я написал ниже.

Работает, вроде как, но не так, как я ожидал. Мой возвращенный список выглядит примерно так:

Index     Type     Size        Value
0         Row      1           Row object of pyodbc module
1         Row      1           Row object of pyodbc module
...
105       Row      1           Row object of pyodbc module

Я надеялся увидеть что-то похожее ниже (т.е. моя таблица в SQL)

ActionId   AnnDate      Name    SaleValue
128929     2018-01-01   Bob     105.3
193329     2018-04-05   Bob     1006.98
...
23654      2018-11-21   Bob     103.32

Разве список - не лучший способ вернуть данные из запроса SQL, используя pyodbc?

Код

import pyodbc


def GetSQLData(dbName, query):

    sPass = 'MyPassword'
    sServer = 'MyServer\\SQL1'
    uname = 'MyUser'

    cnxn = pyodbc.connect("Driver={SQL Server Native Client 11.0};"
                    "Server=" + sServer + ";"
                    "Database=" + dbName + ";"
                    "uid=" + uname + ";pwd=" + sPass)

    cursor = cnxn.cursor()
    cursor.execute(query)

    return list(cursor.fetchall())

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Если вы хотите вернуть результаты запроса в виде списка списков с именами столбцов в качестве первого подсписка (аналогично примеру вывода в вашем вопросе), то вы можете сделать что-то вроде следующего:

import pyodbc


cnxn = pyodbc.connect("YOUR_CONNECTION_STRING")
cursor = cnxn.cursor()

cursor.execute("YOUR_QUERY")

columns = [column[0] for column in cursor.description]
results = [columns] + [row for row in cursor.fetchall()]

for result in results:
    print result

# EXAMPLE OUTPUT
# ['col1', 'col2']
# ['r1c1', 'r1c2']
# ['r2c1', 'r2c2']

В зависимости от того, как вы используете результаты, я часто нахожу более полезным иметь список диктовок. Например:

results = [dict(zip(columns, row)) for row in cursor.fetchall()]

for result in results:
    print result

# EXAMPLE OUTPUT
# {'col1': 'r1c1', 'col2':'r1c2'}
# {'col1': 'r2c1', 'col2':'r2c2'}
0 голосов
/ 05 ноября 2018

Есть даже лучший вариант, чем список, попробуйте Pandas DataFrame ! Это помогает работать с именами столбцов и применять операции с столбцами!

import pandas as pd
import pyodbc


def GetSQLData(dbName, query):

    sPass = 'MyPassword'
    sServer = 'MyServer\\SQL1'
    uname = 'MyUser'

    cnxn = pyodbc.connect("Driver={SQL Server Native Client 11.0};"
                    "Server=" + sServer + ";"
                    "Database=" + dbName + ";"
                    "uid=" + uname + ";pwd=" + sPass)


    df = pd.read_sql(cnxn, query)

    return df  # Pandas Dataframe

EDIT:

Если вы предпочитаете список списков (это означает, что один список в строке), вы можете получить его:

df.values.tolist()  # list of lists 

Но я настоятельно рекомендую вам начать работать с пандами

...