当前位置: 首页 > 知识库问答 >
问题:

SQL,原始查询和参数

邹修真
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})

最后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-正文

对于我实际的工作,我们给出了稍微不同的解决方案。

如果我的方法是一个去。

共有1个答案

楚宇
2023-03-14

mvml都将无法识别,因为您尚未将它们定义为变量。

执行语句的第二个参数是一个字典,在这个字典的键中搜索普通查询"UPDATE客户端SET musicVol=: mv, MessageVol=: ml"中使用冒号转义的所有元素。方法在此字典中未找到键'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无法识别参数。 如果我将代码

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

  • 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

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

  • Entity Framework Core 允许你在使用关系数据库时下降为原生SQL查询。当你想要执行一些 LINQ 无法表达的查询,或者使用 LINQ 会导致发送到数据库的 SQL 效率低下时,这会很有用。 提示 你可以在 GitHub 上查阅当前文章涉及的代码样例。 局限性 使用原生 SQL 查询有一些限制。 SQL 查询只能用于返回模型中的实体类型实例。在我们的待办事项列表中有一个 允许从

  • 问题内容: 我在控制器的函数中。 因此,从表单中,我得到了一个变量的值,说: 然后,我需要在WHERE语句中嵌入该变量(即它的值)。如果我对值进行硬编码,它将带来正确的结果,但是我已经尝试了各种方法来插入该变量而没有成功。好吧,假设我设法使用了该变量,那么我将不得不研究绑定以避免SQL注入,但是到目前为止,我要说的是,看看该变量是否可以在查询中使用。 我已经试过了,双引号,串联。$ vx。,花括号