当前位置: 首页 > 面试题库 >

SQLAlchemy,原始查询和参数

姚正真
2023-03-14
问题内容

我试图使用sqlalchemy执行原始sql查询,想知道什么是“正确”的方法。

我的查询如下(目前):

db.my_session.execute(
    """UPDATE client SET musicVol = {}, messageVol = {}""".format(
    music_volume, message_volume))

我不喜欢的是字符串格式和缺少任何参数处理(在music_volume中用引号引起来的:-D)。

我试图遵循以下答案:

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

应用我阅读的内容后,我的代码段如下所示:

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

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

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


问题答案:

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

:ml”在该字典的键中搜索用冒号转义的普通查询的所有元素。该execute方法没有找到一个关键‘mv’也不‘ml’`在本词典,因此将引发一个错误。

这是正确的版本:

db.my_session.execute(
    "UPDATE client SET musicVol = :mv, messageVol = :ml",
    {'mv': music_volume, 'ml': message_volume}
)


 类似资料:
  • 我正在尝试使用sqlalchemy执行原始sql查询,并想知道什么是“正确”的方法。 我的查询如下(目前): 我不喜欢的是字符串格式和缺乏任何参数处理(你好music_volume引号:-D)。 我试图遵循这个答案: 如何在SQLAlchemy flask应用程序中执行原始SQL 应用我读到的内容后,我的代码片段如下所示: 然而,我得到的错误,mv和ml是不能识别的参数。 如果我把我的代码片段改成

  • Sequelize中有两种查询:使用Model(模型)中的方法查询和使用sequelize.query()进行基于SQL语句的原始查询。 Model查询 1.1 Attributes - 属性与查询字段 1.2 Where - 指定筛选条件 1.3 limit/offset - 分页与限制返回结果数 1.4 查询排序 原始查询 2.1 原始查询方法 2.2 查询参数替换 2.3 参数绑定 1. M

  • 问题内容: 我正在尝试使用原始sqlalchemy查询将值插入Postgres11数据库。通过psql- client运行以下SQL查询时,它可以正常运行: 所有行均正确插入: 但是,如果我在sqlalchemy中创建一个引擎,并使用相同的查询在其上调用execute,它会成功运行,但不会插入任何行: 但是没有插入新行: 通过psql-client运行查询与通过sqlalchemy执行查询有何不同

  • 在模型查询API不够用的情况下,你可以使用原始的sql语句。django提供两种方法使用原始sql进行查询:一种是使用Manager.raw()方法,进行原始查询并返回模型实例;另一种是完全避开模型层,直接执行自定义的sql语句。 警告 编写原始的sql语句时,应该格外小心。每次使用的时候,都要确保转义了参数中的任何控制字符,以防受到sql注入攻击。更多信息请参阅防止sql注入。 进行原始查询 r

  • 由于常常使用简单的方式来执行原始/已经准备好的SQL查询,因此可以使用 sequelize.query 函数. 默认情况下,函数将返回两个参数 - 一个结果数组,以及一个包含元数据(受影响的行等)的对象. 请注意,由于这是一个原始查询,所以元数据(属性名称等)是具体的方言. 某些方言返回元数据 "within" 结果对象(作为数组上的属性). 但是,将永远返回两个参数,但对于MSSQL和MySQL

  • 我试图运行这个简单的原始sql语句与参数SQLALChemy(在一个alembic脚本): 我得到以下错误: 解决方案: