Sqlalchemy,原始查询和参数

Posted

技术标签:

【中文标题】Sqlalchemy,原始查询和参数【英文标题】:Sqlalchemy, raw query and parameters 【发布时间】:2015-05-26 08:38:48 【问题描述】:

我正在尝试使用 sqlalchemy 执行原始 sql 查询,并想知道什么是“正确”的方法。

我的查询如下(目前):

db.my_session.execute(
    """UPDATE client SET musicVol = , messageVol = """.format(
    music_volume, message_volume))

我不喜欢的是字符串格式和缺少任何参数处理(你好,music_volume 中的引号 :-D)。

我试图遵循这个答案:

How to execute raw SQL in SQLAlchemy-flask app

应用我阅读的内容后,我的 sn-p 如下所示:

db.my_session.execute(
    "UPDATE client SET musicVol = :mv , messageVol = :ml", mv=music_volume, ml=message_volume)

但是我收到错误消息,mv 和 ml 是无法识别的参数。

如果我把我的 sn-p 改成这个,它可以工作:

db.my_session.execute(
    "UPDATE client SET musicVol = :mv , messageVol = :ml", mv: music_volume, ml: message_volume)

最后 my_session 在名为 db.py 的文件中启动:

engi = sqlalchemy.create_engine(
    'mysql://user:passwd@host/db'.format(
        host=settings.HOST,
        user=settings.USER,
        passwd=settings.PASS,
        db=settings.DB_NAME), execution_options=
        'autocommit': True,
    )

my_session = sqlalchemy.orm.scoped_session(sqlalchemy.orm.sessionmaker(bind=engi), scopefunc=os.getpid)
sqlalchemy.orm.scoped_session.configure(my_session, autocommit=True)

我想知道的是为什么上面链接的答案和这部分文档:

http://docs.sqlalchemy.org/en/rel_0_9/core/tutorial.html#using-text

显示的解决方案与实际对我有用的解决方案略有不同。

如果我的方法是一种方法。

【问题讨论】:

【参考方案1】:

mvml 都将无法识别,因为您尚未将它们定义为变量。

execute 语句的第二个参数是一个字典,所有用冒号转义的普通查询 "UPDATE client SET musicVol = :mv , messageVol = :ml" 的元素都在这个字典的键中搜索。 execute 方法在此字典中没有找到键 'mv''ml',因此会引发错误。

这是正确的版本:

db.my_session.execute(
    "UPDATE client SET musicVol = :mv, messageVol = :ml",
    'mv': music_volume, 'ml': message_volume
)

【讨论】:

虽然您的评论很有帮助,但您没有回答一件事。如果您按照我添加到问题中的链接进行操作,则会出现类似这样的代码:#推荐 cmd = 'select * from Employees where EmployeeGroup == :group' employeeGroup = 'Staff' employees = connection.execute( text(cmd), group = employeeGroup) 并且它不使用字典就可以工作。这是为什么呢? 这是因为您使用的是execute(type_str),示例显示了execute(type_text) 的用法。通过使用from sqlalchemy.sql import textcmd = text('select * from Employees where EmployeeGroup == :group'),最后使用connection.execute(text(cmd), group=employeeGroup),您可以获得与示例相同的结果。 使用 SqlAlchemy 核心时,请使用text('UPDATE ...') 否则参数将不起作用

以上是关于Sqlalchemy,原始查询和参数的主要内容,如果未能解决你的问题,请参考以下文章

flask-sqlalchemy 迁移数据(生成数据库表)与 查询数据

SQLAlchemy-ORM

使用 Sqlalchemy 连接和 Postgres 从原始字符串编译查询(不使用 .text(...))

sqlalchemy : 使用参数绑定执行原始 sql

SQLAlchemy中的可选参数

我可以让 SQLAlchemy 在不重复完整原始查询的情况下进行子查询预加载吗?