繁体   English   中英

Sqlalchemy、原始查询和参数

[英]Sqlalchemy, raw query and parameters

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

我的查询如下(目前):

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

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

我试图按照这个答案:

如何在 SQLAlchemy-flask 应用程序中执行原始 SQL

应用我阅读的内容后,我的代码片段如下所示:

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

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

如果我将我的代码段更改为这个,它会起作用:

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

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

另外,如果我的方法是一种方法。

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}
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM