Wczytanie danych z bazy danych z tabeli o dynamicznej nazwie

0

Witam. Jestem początkującym programistą. Uczę się programowania baz danych przy pomocy sqlite3
Jakie zapytanie powinienem użyć do wyboru tabeli? Nazwa tabeli ma być zmienną.

x="Tabela1"
cur.execute("SELECT * FROM ??" , x)
0
AWMI napisał(a):

Witam. Jestem początkującym programistą. Uczę się programowania baz danych przy pomocy sqlite3
Jakie zapytanie powinienem użyć do wyboru tabeli? Nazwa tabeli ma być zmienną.

x="Tabela1"
cur.execute("SELECT * FROM ??" , x)

Nie wiem o co pytasz, ale nazwy tabel nie podlegają preparowaniu SQL

0

W bazach relacyjnych (generalnie) musisz wiedzieć skąd i co chcesz pobrać. Dlatego też musisz podać wprost nazwę tabeli oraz określić warunki wyboru wierszy.
Pomijam przypadek kodu generowanego dynamicznie, gdy kształt zapytania może się zmieniać (bo wtedy programista i tak musi znać obiekty, skąd chce pobrać dane).

2
query = f'SELECT * FROM {x}'
c.execute(query)
5
ledi12 napisał(a):
query = f'SELECT * FROM {x}'
c.execute(query)

bez objaśnienia co i jak tu działa to niepełne, początkujący może mieć zupełnie fałszywe wyobrażenia

Tu nie używamy jakiejś szczególnej funkcji SQL, tylko dokonujemy podmian (makrogeneracji) na stringu wejściowym.
Innym spsoobem by było sklejanie stringów +
https://realpython.com/python-f-strings/

Taki string nie musi być kwerendą, to do rzeczy nic nie ma, może być receptą na zupę

0
ZrobieDobrze napisał(a):
ledi12 napisał(a):
query = f'SELECT * FROM {x}'
c.execute(query)

bez objaśnienia co i jak tu działa to niepełne, początkujący może mieć zupełnie fałszywe wyobrażenia

Tu nie używamy jakiejś szczególnej funkcji SQL, tylko dokonujemy podmian (makrogeneracji) na stringu wejściowym.
Innym spsoobem by było sklejanie stringów +
https://realpython.com/python-f-strings/

Taki string nie musi być kwerendą, to do rzeczy nic nie ma, może być receptą na zupę

Dziękuję, działa.

3

Trzeba bardzo mocno podkreślić, że sposobu jaki podał @ledi12 nie wolno używać do przekazywania danych do zapytań, gdyż może to prowadzić do dziur w bezpieczeństwie i ataków typu SQL injection:

query = f'select * from table where column = {value}' # ŹLE
query = 'select * from table where column = :value', {"value": value}) # OK
query = 'select * from table where column = ?', value) # również OK

Nazw tabel nie da się, niestety, przekazać w ten sposób.

0
Spearhead napisał(a):

Trzeba bardzo mocno podkreślić, że sposobu jaki podał @ledi12 nie wolno używać do przekazywania danych do zapytań, gdyż może to prowadzić do dziur w bezpieczeństwie i ataków typu SQL injection:

query = f'select * from table where column = {value}' # ŹLE
query = 'select * from table where column = :value', {"value": value}) # OK
query = 'select * from table where column = ?', value) # również OK

Nazw tabel nie da się, niestety, przekazać w ten sposób.

Dlatego w pythonie 3.11 wprowadzono nowy typ LiteralString dla podobnych przypadków. Oczywiście jest to nadal sprawdzenie statyczne na poziomie ide.

1 użytkowników online, w tym zalogowanych: 0, gości: 1