不能使用python将数据插入sqlite3

时间:2015-01-28 02:01:57

标签: python

我可以使用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。

4 个答案:

答案 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