我试图使用sqlalchemy执行原始sql查询,想知道什么是“正确”的方法。
我的查询如下(目前):
db.my_session.execute( """UPDATE client SET musicVol = {}, messageVol = {}""".format( music_volume, message_volume))
我不喜欢的是字符串格式和缺少任何参数处理(在music_volume中用引号引起来的:-D)。
我试图遵循以下答案:
如何在SQLAlchemy-flask应用程序中执行原始SQL
例子:
from sqlalchemy.sql import text connection = engine.connect() # recommended cmd = 'select * from Employees where EmployeeGroup = :group' employeeGroup = 'Staff' employees = connection.execute(text(cmd), group = employeeGroup) # or - wee more difficult to interpret the command employeeGroup = 'Staff' employees = connection.execute( text('select * from Employees where EmployeeGroup = :group'), group = employeeGroup) # or - notice the requirement to quote 'Staff' employees = connection.execute( text("select * from Employees where EmployeeGroup = 'Staff'")) for employee in employees: logger.debug(employee) # output (0, 'Tim', 'Gurra', 'Staff', '991-509-9284') (1, 'Jim', 'Carey', 'Staff', '832-252-1910') (2, 'Lee', 'Asher', 'Staff', '897-747-1564') (3, 'Ben', 'Hayes', 'Staff', '584-255-2631')
应用我阅读的内容后,我的代码段如下所示:
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})
最后,像在名为db.py的文件中那样启动my_session:
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
对于实际对我有用的解决方案,显示出略有不同的解决方案。
同样,如果我的方法可行。
双方mv并ml不会被认可,因为你还没有他们定义为变量。
mv
ml
execute
:ml”在该字典的键中搜索用冒号转义的普通查询的所有元素。该execute方法没有找到一个关键‘mv’也不‘ml’`在本词典,因此将引发一个错误。
在该字典的键中搜索用冒号转义的普通查询的所有元素。该
方法没有找到一个关键
也不
这是正确的版本:
db.my_session.execute( "UPDATE client SET musicVol = :mv, messageVol = :ml", {'mv': music_volume, 'ml': message_volume} )