【问题标题】:sqlite3.OperationalError: near " ": syntax errorsqlite3.OperationalError:靠近“”:语法错误
【发布时间】:2019-01-12 12:46:38
【问题描述】:

你好吗?我希望如此,所以我正在开发一个商业应用程序,但是这在它所说的 sql 中给出了一个错误: sqlite3.OperationalError: near "José": syntax error 好像短语的空白处有错误

cursor.execute(f"""update funcionarios
            set nome = {nome}, senha = {senha}, telefone = {telefone},
                endereco = {endereco}, anotacoes = {anotacao}
            where cpf = {pesq}
            """)

不带空格的名称“ErlonJunior”有效,但带空格的“José Street”返回此错误:

错误 sqlite3.OperationalError:靠近“José”:语法错误:

【问题讨论】:

  • senha = {senha} 是 Python 中的字符串插值吗?如果是,那么你会得到类似UPDATE tab SET col = Rua Jose 的明显错误,因为你真的想要UPDATE tab set col = 'Rua Jose'。我建议使用参数化查询来避免可能的 SQL 注入攻击。
  • @LukaszSzozda 参数是字符串,给出的错误是字符串的间距,我已经检查了类型

标签: python sql python-3.x python-2.7 sqlite


【解决方案1】:

不要手动格式化您的 SQL 字符串(在您的情况下使用 f 字符串),这很容易出错。您可以在 SQLite3 中使用参数化查询:

import sqlite3

with sqlite3.connect(":memory:") as con:

    cur = con.cursor()

    cur.execute('CREATE TABLE funcionarios (id integer PRIMARY KEY, nome text)')

    cur.execute('INSERT INTO funcionarios (nome) VALUES (:nome)',
      {'nome': 'Rua Jose'})

    cur.execute('UPDATE funcionarios SET nome = :nome WHERE id = 1',
      {'nome': 'Santa Maria'})

    cur.execute('SELECT * FROM funcionarios')
    print(cur.fetchall())

打印出来:

[(1, 'Santa Maria')]

【讨论】:

  • 问题是当我更新时,以多种方式格式化,并继续错误,问题是在更新中它不接受字符串之间的“空白”
  • @ErlonDantas 您可以在任何查询中使用命名参数。我更新了我的答案以使用带有命名参数的 UPDATE 命令。
  • 成功了,哦 SQL 大神@Andrej Kesely Dude,非常感谢,我尝试了很多方法来解决这个问题,非常感谢
猜你喜欢
  • 2021-05-11
  • 2019-02-07
  • 2020-02-06
  • 2014-05-17
  • 2021-10-19
  • 2018-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多