Pyodb c - INSERT INTO SELECT на основе кадра данных - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть датафрейм df, и я хочу выполнить запрос, чтобы вставить в таблицу все значения из этого фрейма. В основном я пытаюсь загрузить как следующий запрос:

INSERT INTO mytable
SELECT *
FROM mydataframe

Для этого у меня есть следующий код:

import pyodbc
import pandas as pd

connection = pyodbc.connect('Driver={' + driver + '} ;'
                            'Server=' + server + ';'
                            'UID=' + user + ';'
                            'PWD=' + pass + ';')

cursor = connection.cursor()

query = 'SELECT * FROM [myDB].[dbo].[myTable]'
df = pd.read_sql_query(query, connection)

sql = 'INSERT INTO [dbo].[new_date] SELECT * FROM :x'
cursor.execute(sql, x=df)
connection.commit()

Однако я получаю следующую ошибку:

TypeError: execute() takes no keyword arguments

Кто-нибудь знает, что я делаю не так?

Спасибо!

Ответы [ 4 ]

1 голос
/ 19 апреля 2020

У меня были некоторые проблемы с подключением pandas к SQL серверу. Но у меня есть это решение, чтобы написать мою DF:

import pyodbc
import sqlalchemy

engine = sqlalchemy.create_engine('mssql+pyodbc://{0}:{1}@{2}:{3}/{4}?driver={5}'.format(username,password,server,port,bdName,driver))
pd.to_sql("TableName",con=engine,if_exists="append")
0 голосов
/ 19 апреля 2020

спасибо за ваши ответы :) но я использую следующий код для решения моей проблемы:

params = urllib.parse.quote_plus("DRIVER={SQL Server};SERVER=servername;DATABASE=database;UID=user;PWD=pass")
engine = sqlalchemy.create_engine("mssql+pyodbc:///?odbc_connect=%s" % params)
engine.connect()
query = query
df = pd.read_sql_query(query, connection)
df.to_sql(name='new_table',con=engine, index=False, if_exists='append')
0 голосов
/ 19 апреля 2020

Для необработанного запроса вставки DB-API из Pandas рассмотрите DataFrame.to_numpy() с executemany и избегайте зацикливания верхнего уровня for. Однако в запросе на добавление необходимо использовать явные столбцы. Отрегулируйте ниже столбцы и заполнители параметров qmark, чтобы они соответствовали столбцам фрейма данных.

# PREPARED STATEMENT
sql = '''INSERT INTO [dbo].[new_date] (Col1, Col2, Col3, ...)
         VALUES (?, ?, ?, ...)
      '''

#  EXECUTE PARAMETERIZED QUERY
cursor.executemany(sql, df.to_numpy().tolist())   
conn.commit()

(И, между прочим, обычно в запросах SQL рекомендуется всегда явно ссылаться на столбцы и избегать SELECT * для удобочитаемости кода, удобства обслуживания и даже производительности.)

0 голосов
/ 19 апреля 2020

cursor.execute не принимает аргументы ключевых слов. Одним из способов вставки может быть использование следующего фрагмента кода:

cols = "`,`".join([str(i) for i in df.columns.tolist()])

# Insert DataFrame recrds one by one.
for i,row in df.iterrows():
    sql = "INSERT INTO `[dbo].[new_date]` (`" +cols + "`) VALUES (" + "?,"*(len(row)-1) + "%s)"
    cursor.execute(sql, tuple(row))

, здесь вы перебираете каждую строку и затем вставляете ее в таблицу.

...