Python - Sqlite - OperationalError:near“s”:语法错误

时间:2017-08-08 18:30:57

标签: python sql database python-2.7 sqlite

尝试向表中添加值时出现以下错误:

line 33, in insert
    c.execute("INSERT INTO {tn} (Process, Info) VALUES('{proc}', 
'{inf}')".format(tn=table_name, proc=proc, inf=content))
OperationalError: near "s": syntax error

当使用某些文本时会发生这种情况,如果我写一些常规的东西没有问题,但是例如类似的东西:

#. My item number one
#. My item number two with some more content
    and it's continuing on the second line?
#. My third item::
    Oh wait, we can put code!
#. My four item::
    No way.
.. _bottom:
    Go to top_'''

失败了...... 这是我正在使用的代码:

def insert(table_name, proc, content):

    conn = sqlite3.connect(sqlite_file)
    conn.text_factory = str
    c = conn.cursor()

    c.execute("INSERT INTO {tn} (Process, Info) VALUES('{proc}', 
              '{inf}')".format(tn=table_name, proc=proc, inf=content))

    conn.commit()
    conn.close()

感谢你们的帮助:)

1 个答案:

答案 0 :(得分:5)

语法错误是由将包含元字符的数据插入到SQL查询中引起的。在您的特定示例中,您的数据包含'字符,并表示字符串的结尾。接下来的字符s就是语法错误。

使用str.format()将数据放入查询中。使用SQL参数并将正确的转义留给数据库驱动程序:

c.execute("INSERT INTO {tn} (Process, Info) VALUES(?, ?)".format(tn=table_name),
          (proc, content))

两个?字符充当数据库驱动程序的占位符,以插入(proc, content)元组中的值。驱动程序将负责正确地转义值。

因为SQL参数只能用于,而不能用于表格之类的对象名称,所以仍然会使用字符串格式来插入表名。您需要 100%确定,表示您不接受table_name变量的任意不受信任的数据。例如,首先根据有效表名列表对该数据进行保存。