Wczytanie danych z bazy danych z tabeli o dynamicznej nazwie

Wczytanie danych z bazy danych z tabeli o dynamicznej nazwie
AW
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2
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ą.

Kopiuj
x="Tabela1"
cur.execute("SELECT * FROM ??" , x)
ZD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2310
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ą.

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

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

R7
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 216
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).

ledi12
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
2
Kopiuj
query = f'SELECT * FROM {x}'
c.execute(query)
ZD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2310
5
ledi12 napisał(a):
Kopiuj
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ę

AW
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2
0
ZrobieDobrze napisał(a):
ledi12 napisał(a):
Kopiuj
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.

Spearhead
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1007
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:

Kopiuj
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.

ledi12
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
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:

Kopiuj
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.