我正在尝试使用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
对我实际工作的方式略有不同。
此外,如果我的方法是一个去。
答案 0 :(得分:14)
mv
和ml
都不会被识别,因为您还没有将它们定义为变量。
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}
)