I have a dataframe df and I want to to execute a query to insert into a table all the values from the dataframe. Basically I am trying to load as the following query:
JavaScript
x
4
1
INSERT INTO mytable
2
SELECT *
3
FROM mydataframe
4
For that I have the following code:
JavaScript
1
17
17
1
import pyodbc
2
import pandas as pd
3
4
connection = pyodbc.connect('Driver={' + driver + '} ;'
5
'Server=' + server + ';'
6
'UID=' + user + ';'
7
'PWD=' + pass + ';')
8
9
cursor = connection.cursor()
10
11
query = 'SELECT * FROM [myDB].[dbo].[myTable]'
12
df = pd.read_sql_query(query, connection)
13
14
sql = 'INSERT INTO [dbo].[new_date] SELECT * FROM :x'
15
cursor.execute(sql, x=df)
16
connection.commit()
17
However, I am getting the following error:
JavaScript
1
2
1
TypeError: execute() takes no keyword arguments
2
Does anyone know what I am doing wrong?
Advertisement
Answer
See below my favourite solution, with UPSERT statement included.
JavaScript
1
7
1
df_columns = list(df)
2
columns = ','.join(df_columns)
3
values = 'VALUES({})'.format(','.join(['%s' for col in df_columns]))
4
update_list = ['{} = EXCLUDED.{}'.format(col, col) for col in df_columns]
5
update_str = ','.join(update_list)
6
insert_stmt = "INSERT INTO {} ({}) {} ON CONFLICT ([your_pkey_here]) DO UPDATE SET {}".format(table, columns, values, update_str)
7