小编典典

SQLAlchemy,原始查询和参数

sql

我试图使用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

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

同样,如果我的方法可行。


阅读 275

收藏
2021-03-23

共1个答案

小编典典

双方mvml不会被认可,因为你还没有他们定义为变量。

executestatement的第二个参数是字典,并且`”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}
)
2021-03-23