Sqlalchemy,原始查询和参数

时间:2015-03-23 11:14:41

标签: python mysql sql sqlalchemy

我正在尝试使用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

在应用我阅读的内容之后,我的代码如下:

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

对我实际工作的方式略有不同。

此外,如果我的方法是一个去。

1 个答案:

答案 0 :(得分:14)

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