【问题标题】:python sqlite3 line not evaluating correctlypython sqlite3 行没有正确评估
【发布时间】:2016-03-27 01:13:45
【问题描述】:

我一定是这里某处有错误,但我找不到它,编写 SQL 的经验不是很丰富......

>>> db.c.execute('INSERT INTO {tn} ({c1n}, {c2n}) VALUES ({wn}, {f})'.\
...    format(tn=db.table1, c1n=db.column1, c2n=db.column2, wn='someword', f=1))

它给了我这个回溯...

Traceback (most recent call last):
    File "<stdin>", line 2, in <module>
    sqlite3.OperationalError: no such column: someword

'someword' 应该是它要插入的值,而不是它要查找的列,对吧?

【问题讨论】:

    标签: python sql sqlite


    【解决方案1】:

    您缺少值周围的引号:

    INSERT INTO {tn} ({c1n}, {c2n}) VALUES ('{wn}', '{f}')
                                        HERE^
    

    附带说明,您不应该通过字符串格式进行查询 - 这是不安全的,您使您的代码容易受到SQL injection attacks 的攻击,并且在类型转换和引号方面遇到问题(如你已经可以看到)。使用parameterized queries。不幸的是,you cannot parameterize table and column names 应该单独验证它们;但您可以对列值进行参数替换:

    db.c.execute('INSERT INTO {tn} ({c1n}, {c2n}) VALUES (:wn, :f)'.\
        format(tn=db.table1, c1n=db.column1, c2n=db.column2), {'wn': 'someword', 'f': 1})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-22
      • 2013-05-11
      • 2015-01-18
      相关资源
      最近更新 更多