如何在SQLAlchemy中执行原始SQL ?
我有一个python web应用程序,运行在flask和接口到数据库通过SQLAlchemy。
我需要一种方法来运行原始SQL。该查询涉及多个表连接和内联视图。
我试过了:
connection = db.session.connection()
connection.execute( <sql here> )
但是我总是得到网关错误。
如何在SQLAlchemy中执行原始SQL ?
我有一个python web应用程序,运行在flask和接口到数据库通过SQLAlchemy。
我需要一种方法来运行原始SQL。该查询涉及多个表连接和内联视图。
我试过了:
connection = db.session.connection()
connection.execute( <sql here> )
但是我总是得到网关错误。
当前回答
Flask-SQLAlchemy v: 3.0。x / SQLAlchemy v: 1.4
users = db.session.execute(db.select(User).order_by(User.title.desc()).limit(150)).scalars()
因此,对于flask-sqlalchemy的最新稳定版本,文档建议将session.execute()方法与db.select(Object)结合使用。
其他回答
你有没有试过:
result = db.engine.execute("<sql here>")
or:
from sqlalchemy import text
sql = text('select name from penguins')
result = db.engine.execute(sql)
names = [row[0] for row in result]
print names
注意,db.engine.execute()是“无连接的”,这在SQLAlchemy 2.0中已弃用。
可以使用from_statement()和text()获得SELECT SQL查询的结果,如下所示。您不必以这种方式处理元组。举个例子,User类的表名是users,你可以试试,
from sqlalchemy.sql import text
user = session.query(User).from_statement(
text("""SELECT * FROM users where name=:name""")
).params(name="ed").all()
return user
Flask-SQLAlchemy v: 3.0。x / SQLAlchemy v: 1.4
users = db.session.execute(db.select(User).order_by(User.title.desc()).limit(150)).scalars()
因此,对于flask-sqlalchemy的最新稳定版本,文档建议将session.execute()方法与db.select(Object)结合使用。
这是如何从Flask Shell运行SQL查询的简化答案
首先,映射您的模块(如果您的模块/应用程序在principal文件夹中是manage.py,并且您是在UNIX操作系统中),运行:
export FLASK_APP=manage
运行烧瓶外壳
flask shell
导入我们需要的::
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)
from sqlalchemy import text
运行查询:
result = db.engine.execute(text("<sql here>").execution_options(autocommit=True))
这使用当前有应用程序的数据库连接。
如果你想避免元组,另一种方法是调用第一个,一个或所有方法:
query = db.engine.execute("SELECT * FROM blogs "
"WHERE id = 1 ")
assert query.first().name == "Welcome to my blog"