Sqlalchemy,原始查询和参数

Dra*_*els 9 python mysql sql sqlalchemy

我正在尝试使用sqlalchemy执行原始sql查询,并想知道什么是"正确"的方法来做到这一点.

我的查询如下(现在):

db.my_session.execute(
    """UPDATE client SET musicVol = {}, messageVol = {}""".format(
    music_volume, message_volume))
Run Code Online (Sandbox Code Playgroud)

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

我试着按照这个答案:

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

应用我读到的内容后,我的代码如下:

db.my_session.execute(
    "UPDATE client SET musicVol = :mv , messageVol = :ml", mv=music_volume, ml=message_volume)
Run Code Online (Sandbox Code Playgroud)

但是我收到的错误是mv和ml是无法识别的参数.

如果我将我的代码段更改为此代码,则可以:

db.my_session.execute(
    "UPDATE client SET musicVol = :mv , messageVol = :ml", {mv: music_volume, ml: message_volume})
Run Code Online (Sandbox Code Playgroud)

最后,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)
Run Code Online (Sandbox Code Playgroud)

我想知道的是为什么回答上面链接和这部分文档:

http://docs.sqlalchemy.org/en/rel_0_9/core/tutorial.html#using-text

对我实际工作的内容显示略有不同的解决方案.

如果我的方法是一个去.

mpi*_*ore 18

双方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}
)
Run Code Online (Sandbox Code Playgroud)

  • 这是因为你使用`execute(type_str)`并且示例显示了`execute(type_text)`的用法.您可以使用`from sqlalchemy.sql import text`和`cmd = text('select*from Employees where EmployeeGroup ==:group')`以及最后`connection.execute(text(cmd))获得与示例相同的结果,group = employeeGroup)`. (3认同)