Cześć!
Cały dzień próbuję znaleźć optymalne rozwiązanie, żeby przekazać jednocześnie nazwę tabeli oraz wartości do tej tabeli jako parametry, żeby wykonać wpis do bazy danych.
Podążałem za instrukcjami jak tutaj:
https://stackoverflow.com/que[...]me-as-a-parameter-in-psycopg2
https://www.psycopg.org/docs/sql.html#module-psycopg2.sql
Mój kod wygląda następująco:
new_dict = {
"Product": (('chleb', 'pszenny', 10.5), ('mąka', 'żytnia', 4.50)),
"Orders": (('zamówienie 1',), ('zamówienie 2',)),
"Client": ((1, 'Zygmunt', 'Wachlarz'),(2, 'olek', 'kolek'))
}
def insert_into_table(table_inserts, db_name):
cnx = connection(db_name)
cur = cnx.cursor()
table_names = table_inserts.keys()
for table_name in table_names:
for i in range(len(table_inserts[table_name])):
cur.execute(sql.SQL("INSERT INTO {} values %s").format(sql.Identifier(table_name)),
(table_inserts[table_name][i],))
cur.close()
cnx.close()
insert_into_table(new_dict, "exercises_db")
Otrzymuję następujący błąd:
- psycopg2.errors.UndefinedTable: relation "Product" does not exist
LINE 1: INSERT INTO "Product" values ('chleb', 'pszenny', 10.5)
Co ciekawe gdy wykonam print:
print(sql.SQL("INSERT INTO {} values (%s)").format(sql.Identifier(table_name)),
(table_inserts[table_name][i],))
otrzymuję
- Composed([SQL('INSERT INTO '), Identifier('Product'), SQL(' values (%s)')]) (('chleb', 'pszenny', 10.5),)
Gdy wykonam print:
print(sql.SQL("INSERT INTO {} values (%s)").format(sql.Identifier('Product')),
(table_inserts[table_name][i],))
Wynik wydaje się być taki sam
- Composed([SQL('INSERT INTO '), Identifier('Product'), SQL(' values (%s)')]) (('chleb', 'pszenny', 10.5),)
I teraz coś czego nie rozumiem. Na stackowerflow, a później także w dokumentacji jest mowa o przekazywaniu parametru, jednak za każdym przykładem (tutaj dla nazwy tabeli) parametr ten jest przekazywany jako string w pojedynczym cudzysłowie (jak drugi print), co dla mnie oznacza tyle, że został wprowadzony ręcznie, a nie jako parametr, który został przekazany do funkcji.
Co do wyników printów - wydają się identyczne.
Jak podstawiałem do inserta nazwę tabeli jako parametr table_name wyskoczył error, a nazwa tabeli była przekazywana w cudzysłowie. Natomiast gdy próbowałem zrobić insert przekazując parametr wpisując go ręcznie jako 'Product', operacja powiodła się i wpis został dodany do bazy danych.
Czy ktoś mógłby mi naświetlić co się tutaj dzieje i czy w ogóle da się przekazać nazwę tabeli jako parametr?