我想定义一个带有参数的函数,该函数将数据添加到sqlite3中的表中。
我正在关注youtube上的一个教程,即:https://www.youtube.com/watch?v=o-vsdfCBpsU
我做了同样的事情,并且在我决定提出一些论点之前没有任何问题:
import sqlite3
conn = sqlite3.connect('tutorial.db')
c = conn.cursor()
def create_table():
#c.execute('CREATE TABLE IF NOT EXISTS stuffToPlot(unix REAL, datestamp TEXT, keyword TEXT, value REAL)')
c.execute('CREATE TABLE IF NOT EXISTS info(names TEXT, floats REAL, ints INTEGER, personalities TEXT)')
def data_entry(name, float, int, personality):
#c.execute("INSERT INTO stuffToPlot VALUES(8010, '2016-01-02', 'Python', 8)")
c.execute("INSERT INTO info VALUES(name, float, int, personality)")
conn.commit()
c.close()
conn.close()
create_table()
ref = [25,35,45,55,65,78,89,90]
for i in range(5):
for j in ref:
data_entry(j, .888, i, 'kind')
在data_entry
函数中,VALUES()括号内的“名称”显然引起此错误:
OperationalError:没有这样的列:name
我这样做是为了分析仿真,所以我要处理数据库中的许多行数据,这需要使用类似这样的函数来完成
答案 0 :(得分:0)
您需要使用绑定变量来传递值。如果您将插入内容更改为
c.execute("INSERT INTO info VALUES(?,?,?,?)", [name, float, int, personality])
它应该工作。这告诉它插入值并交换'?'传递给要执行的列表中的值。
此外,正如评论中指出的那样,您需要确定是否要将该列作为“名称”或“名称”,然后相应地更改查询。
最后一点,您实际上不应该使用float
和int
作为变量名。它们是数据类型,因此可能会造成混淆。
编辑,这应该可以工作。做了一些改进。我添加了一个finally块来关闭连接。这样即使出现错误连接也会被关闭。 def有一种更简洁的编写方法,但这至少应该可以工作。
import sqlite3
conn = sqlite3.connect('tutorial.db')
c = conn.cursor()
def create_table():
#c.execute('CREATE TABLE IF NOT EXISTS stuffToPlot(unix REAL, datestamp TEXT, keyword TEXT, value REAL)')
c.execute('CREATE TABLE IF NOT EXISTS info(names TEXT, floats REAL, ints INTEGER, personalities TEXT)')
def data_entry(name, float, int, personality):
#c.execute("INSERT INTO stuffToPlot VALUES(8010, '2016-01-02', 'Python', 8)")
c.execute("INSERT INTO info VALUES(?,?,?,?)", [name, float, int, personality])
conn.commit()
try:
create_table()
ref = [25,35,45,55,65,78,89,90]
for i in range(5):
for j in ref:
data_entry(j, .888, i, 'kind')
except:
raise
finally:
conn.close()
答案 1 :(得分:0)
您在数据输入中使用的SQL命令将不起作用。您实际上并没有提供要插入的任何值,也没有定义要使用的列。
正确插入sqlite3看起来像这样:
to_sql_dict = {
"name": name,
"float": float,
"int": int,
"personality": personality
}
SQL = """INSERT INTO info (
names, floats, ints, personalities
) VALUES (
:name, :float, :int, :personality
)"""
c.execute(SQL, to_sql_dict)
这是正确的方法。一种更简单的方法仅涉及SQL,但建议不要这样做,因为它可能会受到SQL注入攻击的攻击:
SQL = """INSERT INTO info (
names, floats, ints, personalities
) VALUES (
{}, {}, {}, {}
)""".format(name, float, int, personality)
c.execute(SQL)
任何一种方法都应该起作用,但是正如我提到的,您应该尝试使其首先起作用。
PS。注意列名:使用复数通常是不常见的做法。 编辑:代码。