Как экспортировать запрос в Excel, используя Python? - PullRequest
0 голосов
/ 01 апреля 2019

Я пытался перебрать список в качестве параметра для запроса из базы данных и преобразовать его в формат xlsx, используя модули pyodbc, pandas, xlsxwriter.

Однако приведенное ниже сообщение продолжает появляться, несмотря на процесс проб и ошибок: первый аргумент для выполнения должен быть строковым или юникодным запросом.

Может ли это быть как-то связано с запросомсам по себе или модуль 'pandas'?

Спасибо.

Это для экспорта результата запроса в электронную таблицу Excel с использованием pandas и pyodbc, с python 3.7 ver.

import pyodbc
import pandas as pd 

#Database Connection
conn = pyodbc.connect(driver='xxxxxx', server='xxxxxxx', database='xxxxxx',
                      user='xxxxxx', password='xxxxxxxx')

cursor = conn.cursor()

depts = ['Human Resources','Accounting','Marketing']

query = """
                           SELECT *
                           FROM device ID 
                           WHERE
                           Department like ?
                           AND
                           Status like 'Active'
                           """

target = r'O:\\Example'

today = target + os.sep + time.strftime('%Y%m%d')

if not os.path.exists(today):
    os.mkdir(today)

for i in departments:
    cursor.execute(query, i)
    #workbook = Workbook(today + os.sep + i + 'xlsx')
    #worksheet = workbook.add_worksheet()
    data = cursor.fetchall()
    P_data = pd.read_sql(data, conn)
    P_data.to_excel(today + os.sep + i + 'xlsx')

1 Ответ

2 голосов
/ 01 апреля 2019

Когда вы читаете данные в фрейм данных с помощью pandas.read_sql (), pandas ожидает, что первым аргументом будет запрос для выполнения (в строковом формате), не результаты запроса.

Вместо вашей линии:

P_data = pd.read_sql(data, conn)

Вы хотите использовать:

P_data = pd.read_sql(query, conn)

И чтобы отфильтровать отделы, вы бы хотели сериализовать список в строку синтаксиса SQL:

depts = ['Human Resources','Accounting','Marketing']

# gives you the string to use in your sql query:
depts_query_string = "('{query_vals}')".format(query_vals="','".join(depts))

Чтобы использовать новую строку SQL в вашем запросе, используйте str.format:

query = """
                           SELECT *
                           FROM device ID 
                           WHERE
                           Department in {query_vals}
                           AND
                           Status like 'Active'
                           """.format(query_vals=depts_query_string)

Все вместе сейчас:

import pyodbc
import pandas as pd 

#Database Connection
conn = pyodbc.connect(driver='xxxxxx', server='xxxxxxx', database='xxxxxx',
                      user='xxxxxx', password='xxxxxxxx')

cursor = conn.cursor()

depts = ['Human Resources','Accounting','Marketing']

# gives you the string to use in your sql query:
depts_query_string = "('{query_vals}')".format(query_vals="','".join(depts))

query = """
                            SELECT *
                            FROM device ID 
                            WHERE
                            Department in {query_vals}
                            AND
                            Status like 'Active'
                            """.format(query_vals=depts_query_string)

target = r'O:\\Example'

today = target + os.sep + time.strftime('%Y%m%d')

if not os.path.exists(today):
    os.mkdir(today)

for i in departments:
    #workbook = Workbook(today + os.sep + i + 'xlsx')
    #worksheet = workbook.add_worksheet()
    P_data = pd.read_sql(query, conn)
    P_data.to_excel(today + os.sep + i + 'xlsx')
...