我可以使用Python在sqlite3数据库中成功创建表,但我无法向其中插入数据
# coding: utf-8
import sqlite3
text = "Welcome"
def cur_execute(data):
con = sqlite3.connect('sqlite3.db')
try:
with con:
cur = con.cursor()
cur.execute(data)
con.commit()
except Exception as why:
print(why)
finally:
if con: con.close()
cur_execute("CREATE TABLE Hello(test TEXT)")
cur_execute("INSERT INTO Hello VALUES(?)", (text))
向我展示这个错误:cur_execute()只需1个参数(给定2个)
THX。
答案 0 :(得分:2)
@zoosuck回答有效,但它也删除了为库内置的sql sanitation。您可以通过实现以下内容来使用内置的sql清理:
import sqlite3
text = "Welcome"
def cur_execute(data, args=()):
con = sqlite3.connect('sqlite3.db')
with con:
cur = con.cursor()
cur.execute(data, args)
con.commit()
cur_execute("CREATE TABLE Hello(test TEXT)")
cur_execute("INSERT INTO Hello VALUES(?)", (text, ))
请注意,使用with
语句,您无需关闭连接。我删除了连接周围的try catch,以便在发生错误时显示完整错误。
此外,您的原始代码存在问题。 cur_execute("INSERT INTO Hello VALUES(?)", (text))
中的第二个参数需要是一个元组/列表。
答案 1 :(得分:2)
你可以这样做
# coding: utf-8
import sqlite3
text = "Welcome"
def cur_execute(data, *args):
con = sqlite3.connect('sqlite3.db')
with con:
cur = con.cursor()
cur.execute(data, args)
con.commit()
cur_execute("CREATE TABLE Hello(test TEXT)")
cur_execute("INSERT INTO Hello VALUES(?)", text)
这样,您可以保留cur.execute的功能以转义输入数据。这可以防止SQL注入攻击。
如果您想在表格中添加2件事,可以改为调用您的函数。
cur_execute("CREATE TABLE Hello2(test1 TEXT, test2 TEXT)")
cur_execute("INSERT INTO Hello2 VALUES(?, ?)", text, "stuff")
它将生成另一个包含2个文本字段的表。那是你要求做的吗?
答案 2 :(得分:1)
你已经将cur_execute
函数定义为只接受一个参数,然后尝试将两个参数传递给它,就像zoosuck所说的那样。
但是,他的方法仍然容易受到sql注入 - 你应该让数据库API处理字符串格式化。您希望能够将两个参数传递给您的函数,而不仅仅是一个。你可以尝试:
import sqlite3
data = "Welcome"
def cur_execute(data,*args):
con = sqlite3.connect('sqlite3.db')
try:
with con:
cur = con.cursor()
if args is not None:
cur.execute(data,args)
else:
cur.execute(data)
con.commit()
except Exception as why:
print(why)
finally:
if con: con.close()
cur_execute("CREATE TABLE Hello(test TEXT)")
cur_execute("INSERT INTO Hello VALUES(?)", (data))
答案 3 :(得分:0)
该函数取一个参数:SQL(字符串类型),你的第二个调用给它两个参数,只需改变你的代码格式化SQL即可:
import sqlite3
data = "Welcome"
def cur_execute(data):
con = sqlite3.connect('sqlite3.db')
try:
with con:
cur = con.cursor()
cur.execute(data)
con.commit()
except Exception as why:
print(why)
finally:
if con: con.close()
cur_execute("CREATE TABLE Hello(test TEXT)")
cur_execute("INSERT INTO Hello VALUES('{0}')".format(data)) # format sql and call it