繁体   English   中英

无法使用python将数据插入sqlite3

[英]can't insert data into sqlite3 using 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个)

谢谢。

@zoosuck答案有效,但是它也删除了为库内置的sql卫生设施。 您可以通过执行以下操作来使用内置的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))的第二个参数必须是一个元组/列表。

你可以这样

# 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个文本字段的表。 那是你要做什么吗?

cur_execute您已将cur_execute函数定义为仅接受一个参数,然后尝试向其传递两个参数。

但是,他的方法仍然容易受到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))

该函数带有一个参数: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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM