簡體   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