Raf*_*del 1 python sqlite python-3.x
我正在Python上练习并尝试创建一个帮助执行数据库操作的类,但是当插入数据库时,这里是代码:
def Insert(self, **kwargs):
self.__query.execute("INSERT INTO {} ({}) VALUES ({})".format(self.table, ", ".join(kwargs.keys()), ", ".join(str(v) for v in kwargs.values())))
self.__db.commit()
Run Code Online (Sandbox Code Playgroud)
当我运行此代码进行测试时:
MyTable.Insert(id=3, name="jack", age=23)
Run Code Online (Sandbox Code Playgroud)
我收到了这个错误:
sqlite3.OperationalError:没有这样的列:jack
当我用execute命令替换命令时print:
INSERT INTO testTbl111 (id, name, age) VALUES (3, jack, 23)
Run Code Online (Sandbox Code Playgroud)
我猜jack必须被引号包围.
我的问题是:jack在做的时候如何围绕报价", ".join(str(v) for v in kwargs.values())?
您不想尝试自己转义值参数,而是想要构建insert查询并将占位符(?适用于sqlite3)用于values- 例如:
query = 'INSERT INTO {} ({}) VALUES({})'.format(self.table, ', '.join(kwargs), ','.join(['?'] * len(kwargs)))
Run Code Online (Sandbox Code Playgroud)
然后,使用第二种执行方法(在db对象或游标对象上)传入要替换的值 - 这些将自动为数据库正确转义.
self.__db.execute(query, list(kwargs.values()))
Run Code Online (Sandbox Code Playgroud)