Как вы выполняете сырой SQL в SQLAlchemy?
У меня есть веб-приложение на Python, которое работает на колбе и взаимодействует с базой данных через SQLAlchemy.
Мне нужен способ запустить сырой SQL. Запрос включает в себя несколько объединений таблиц наряду с встроенными представлениями.
Я пробовал:
connection = db.session.connection()
connection.execute( <sql here> )
Но я продолжаю получать ошибки шлюза.
python
sql
sqlalchemy
flask
flask-sqlalchemy
starwing123
источник
источник
namedtuple
иdict
напрямую: initd.org/psycopg/docs/extras.html .Ответы:
Ты пробовала:
или:
источник
BEGIN
иCOMMIT
.db.engine.execute(text("<sql here>")).execution_options(autocommit=True))
выполняет и фиксирует это тоже.Объекты сеанса SQL Alchemy имеют свой собственный
execute
метод:Все запросы вашего приложения должны проходить через объект сеанса, независимо от того, являются ли они необработанным SQL или нет. Это обеспечивает правильное управление запросами с помощью транзакции , что позволяет фиксировать или откатывать несколько запросов в одном запросе как один блок. Выход за пределы транзакции с использованием механизма или соединения подвергает вас гораздо большему риску скрытых, возможно трудных для обнаружения ошибок, которые могут оставить вас с поврежденными данными. Каждый запрос должен быть связан только с одной транзакцией, и использование
db.session
гарантирует, что это относится к вашему приложению.Также обратите внимание, что
execute
он предназначен для параметризованных запросов . Используйте параметры, как:val
в примере, для любых входных данных запроса, чтобы защитить себя от атак SQL-инъекций. Вы можете предоставить значение для этих параметров, передав вdict
качестве второго аргумента a , где каждый ключ - это имя параметра в том виде, в каком оно появляется в запросе. Точный синтаксис самого параметра может отличаться в зависимости от вашей базы данных, но все основные реляционные базы данных поддерживают их в той или иной форме.Если предположить , что это
SELECT
запрос, это вернет итератор изRowProxy
объектов.Вы можете получить доступ к отдельным столбцам различными способами:
Лично я предпочитаю конвертировать результаты в
namedtuple
s:Если вы не используете расширение Flask-SQLAlchemy, вы все равно можете легко использовать сеанс:
источник
документы: Учебник по языку выражений SQL - Использование текста
пример:
источник
==
?=
обычно резервируется для присвоения значения; тогда как==
зарезервировано для сравнения значенийВы можете получить результаты запросов SELECT SQL, используя
from_statement()
иtext()
как показано здесь . Вы не должны иметь дело с кортежами таким образом. В качестве примера для класса,User
имеющего имя таблицы,users
вы можете попробовать,источник
выполняет,
<sql here>
но не фиксирует это, если вы не вautocommit
режиме. Таким образом, вставки и обновления не отражаются в базе данных.Чтобы зафиксировать после изменений, сделайте
источник
Во-первых, сопоставьте ваш модуль (если ваш модуль / приложение - файл manage.py в основной папке, а вы - в операционной системе UNIX), запустите:
Запустить колбу
Импортируйте то, что нам нужно:
Запустите ваш запрос:
Это использует текущее соединение с базой данных, которое имеет приложение.
источник
Вы пробовали использовать
connection.execute(text( <sql here> ), <bind params here> )
и связывать параметры, как описано в документации ? Это может помочь решить многие проблемы форматирования параметров и производительности. Может быть, ошибка шлюза - это тайм-аут? Параметры связывания обычно ускоряют выполнение сложных запросов.источник
connection.execute(text(<sql here>), <bind params> )
.bind params
НЕ должно быть вtext()
. подача параметров привязки в метод execute ()Если вы хотите , чтобы избежать кортежи, другой путь, вызывая
first
,one
илиall
методы:источник