I’m trying to insert several Pandas DataFrames to corresponding PostgreSQL tables, each with a different Primary Key. I’ve attempted to implement the following method
according to the documentation:
<code>def insert_on_conflict_nothing(table, conn, keys, data_iter):
# tableIndex is the primary key in "conflict_table"
data = [dict(zip(keys, row)) for row in data_iter]
pkey = [pk_column.name for pk_column in table.primary_key.columns.values()]
stmt = insert(table.table).values(data).on_conflict_do_nothing(index_elements=pkey)
result = conn.execute(stmt)
return result.rowcount
</code>
<code>def insert_on_conflict_nothing(table, conn, keys, data_iter):
# tableIndex is the primary key in "conflict_table"
data = [dict(zip(keys, row)) for row in data_iter]
pkey = [pk_column.name for pk_column in table.primary_key.columns.values()]
stmt = insert(table.table).values(data).on_conflict_do_nothing(index_elements=pkey)
result = conn.execute(stmt)
return result.rowcount
</code>
def insert_on_conflict_nothing(table, conn, keys, data_iter):
# tableIndex is the primary key in "conflict_table"
data = [dict(zip(keys, row)) for row in data_iter]
pkey = [pk_column.name for pk_column in table.primary_key.columns.values()]
stmt = insert(table.table).values(data).on_conflict_do_nothing(index_elements=pkey)
result = conn.execute(stmt)
return result.rowcount
and then pass it on in a function:
<code>def insert_workouts(workouts_df):
engine = create_engine('postgresql+psycopg2://' + db_user + ':' + db_pass + '@' + db_host + '/' + db_name)
workouts_table_columns = pd.read_sql('SELECT * FROM fitness.workouts WHERE 1=2', engine).columns.to_list()
workouts_df.columns = workouts_table_columns
workouts_df.to_sql(
name='workouts',
schema='fitness',
con=engine,
if_exists='append',
index=False,
method=insert_on_conflict_nothing
)
</code>
<code>def insert_workouts(workouts_df):
engine = create_engine('postgresql+psycopg2://' + db_user + ':' + db_pass + '@' + db_host + '/' + db_name)
workouts_table_columns = pd.read_sql('SELECT * FROM fitness.workouts WHERE 1=2', engine).columns.to_list()
workouts_df.columns = workouts_table_columns
workouts_df.to_sql(
name='workouts',
schema='fitness',
con=engine,
if_exists='append',
index=False,
method=insert_on_conflict_nothing
)
</code>
def insert_workouts(workouts_df):
engine = create_engine('postgresql+psycopg2://' + db_user + ':' + db_pass + '@' + db_host + '/' + db_name)
workouts_table_columns = pd.read_sql('SELECT * FROM fitness.workouts WHERE 1=2', engine).columns.to_list()
workouts_df.columns = workouts_table_columns
workouts_df.to_sql(
name='workouts',
schema='fitness',
con=engine,
if_exists='append',
index=False,
method=insert_on_conflict_nothing
)
This, however, results in the following error: AttributeError: 'SQLTable' object has no attribute 'primary_key'
.
Can anyone help me figure out a way to check the respective table’s primary key (in my case, it will always be one column, if that matters), so that I don’t have to hard-code it in multiple methods?
Thanks!