如何在将数据添加到sqlite3中的表的函数中使用参数?

时间:2019-04-24 14:15:31

标签: python database ubuntu sqlite

我想定义一个带有参数的函数,该函数将数据添加到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

我这样做是为了分析仿真,所以我要处理数据库中的许多行数据,这需要使用类似这样的函数来完成

2 个答案:

答案 0 :(得分:0)

您需要使用绑定变量来传递值。如果您将插入内容更改为

c.execute("INSERT INTO info VALUES(?,?,?,?)", [name, float, int, personality])

它应该工作。这告诉它插入值并交换'?'传递给要执行的列表中的值。

此外,正如评论中指出的那样,您需要确定是否要将该列作为“名称”或“名称”,然后相应地更改查询。

最后一点,您实际上不应该使用floatint作为变量名。它们是数据类型,因此可能会造成混淆。

编辑,这应该可以工作。做了一些改进。我添加了一个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。注意列名:使用复数通常是不常见的做法。 编辑:代码。