Jak wykonać surowy SQL w SQLAlchemy?
Mam aplikacji sieci web Python, która działa na kolbie i interfejsów do bazy danych za pośrednictwem SQLAlchemy.
Potrzebuję sposobu na uruchomienie surowego SQL. Kwerenda obejmuje wiele połączeń tabel wraz z widokami Inline.
Próbowałem:
connection = db.session.connection()
connection.execute( <sql here> )
Ale ciągle pojawiają się błędy bramy.
python
sql
sqlalchemy
flask
flask-sqlalchemy
starwing123
źródło
źródło
namedtuple
idict
bezpośrednio: initd.org/psycopg/docs/extras.html .Odpowiedzi:
Czy próbowałeś:
lub:
źródło
BEGIN
iCOMMIT
.db.engine.execute(text("<sql here>")).execution_options(autocommit=True))
wykonuje to i zatwierdza.Obiekty sesji Alchemia SQL mają własną
execute
metodę:Wszystkie zapytania aplikacji powinny przechodzić przez obiekt sesji, bez względu na to, czy jest to surowy SQL, czy nie. Zapewnia to prawidłowe zarządzanie zapytaniami przez transakcję , co pozwala na zatwierdzenie lub wycofanie wielu zapytań w tym samym żądaniu jako pojedynczej jednostki. Wyjście poza transakcję za pomocą silnika lub połączenia naraża Cię na znacznie większe ryzyko subtelnych, być może trudnych do wykrycia błędów, które mogą spowodować uszkodzenie danych. Każde żądanie powinno być powiązane tylko z jedną transakcją, a użycie
db.session
zapewni, że tak będzie w przypadku Twojej aplikacji.Weź również pod uwagę, że
execute
jest przeznaczony do sparametryzowanych zapytań . Użyj parametrów, takich jak:val
w przykładzie, do wszelkich danych wejściowych do zapytania, aby uchronić się przed atakami iniekcyjnymi SQL. Możesz podać wartość tych parametrów, przekazującdict
jako drugi argument, gdzie każdy klucz jest nazwą parametru wyświetlaną w zapytaniu. Dokładna składnia samego parametru może być różna w zależności od bazy danych, ale wszystkie główne relacyjne bazy danych obsługują je w jakiejś formie.Zakładając, że jest to
SELECT
zapytanie, zwróci iterowalną liczbęRowProxy
obiektów.Możesz uzyskać dostęp do poszczególnych kolumn za pomocą różnych technik:
Osobiście wolę przekonwertować wyniki na
namedtuple
s:Jeśli nie używasz rozszerzenia Flask-SQLAlchemy, nadal możesz łatwo użyć sesji:
źródło
docs: Samouczek języka SQL Expression - Korzystanie z tekstu
przykład:
źródło
==
?=
zwykle jest zarezerwowany do przypisywania wartości; mając na uwadze, że==
jest zarezerwowany do porównywania wartościMożesz uzyskać wyniki zapytań SELECT SQL za pomocą
from_statement()
itext()
jak pokazano tutaj . W ten sposób nie musisz radzić sobie z krotkami. Jako przykład dla klasyUser
o nazwie tabeli,users
którą możesz wypróbować,źródło
wykonuje,
<sql here>
ale go nie zatwierdza, chyba że jesteś wautocommit
trybie. Tak więc wstawki i aktualizacje nie odzwierciedlają się w bazie danych.Aby zatwierdzić po zmianach, wykonaj
źródło
Najpierw zamapuj moduł (jeśli Twój moduł / aplikacja jest manage.py w folderze głównym, a jesteś w systemie operacyjnym UNIX), uruchom:
Uruchom pocisk Flask
Zaimportuj to, czego potrzebujemy:
Uruchom zapytanie:
Wykorzystuje to obecnie połączenie z bazą danych, które ma aplikację.
źródło
Czy próbowałeś używać
connection.execute(text( <sql here> ), <bind params here> )
i wiązać parametry zgodnie z opisem w dokumentacji ? Pomoże to rozwiązać wiele problemów z formatowaniem parametrów i wydajnością. Być może błąd bramy przekroczył limit czasu? Parametry wiązania powodują, że złożone zapytania są wykonywane znacznie szybciej.źródło
connection.execute(text(<sql here>), <bind params> )
.bind params
NIE powinno być wtext()
. wprowadzanie parametrów wiązania do metody execute ()Jeśli chcesz uniknąć krotki, innym sposobem jest wywołanie
first
,one
aniall
metod:źródło