iT邦幫忙

0

python sqlite3的編輯測試寫入失敗

import sqlite3

conn = sqlite3.connect("test.db")
cursor = conn.cursor()
print('Connect ok')

#建立表
cursor.execute(
'''CREATE TABLE HUMAN
(ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL);''')

print('Table created.')
conn.commit()

#新增資料
cursor.execute("INSERT INTO HUMAN (ID,NAME,AGE) VALUES (?,?,?)",(1, 'Wendy', 16))

不知道為什麼
無法寫入
這是正常現象嗎?
還是我的程式碼問題?

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

2
一級屠豬士
iT邦大師 1 級 ‧ 2021-03-09 22:35:24
最佳解答
#!/usr/local/bin/python3
import sqlite3

conn = sqlite3.connect("test.db")
cursor = conn.cursor()
print('Connect ok')

#建立表
cursor.execute(
'''CREATE TABLE HUMAN
(ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL);''')

print('Table created.')
conn.commit()

#新增資料
cursor.execute("INSERT INTO HUMAN (ID,NAME,AGE) VALUES (1,?,?)",('Wendy', 16))
conn.commit()
conn.close()

後面要補上 commit, 另外要記得 close.

https://ithelp.ithome.com.tw/upload/images/20210309/20050647w15SuI9WLr.png

看更多先前的回應...收起先前的回應...

沒想到連 sqlite3 這種迷你資料庫也難不倒您
/images/emoticon/emoticon07.gif

s4028600 iT邦新手 5 級 ‧ 2021-03-09 22:49:26 檢舉

我後面有很多不相關的
在測試時都刪掉
然後就誤刪了……

想問一下
那個問號能夠用f-string之類的寫法嗎
他變數只能用問號嗎

#!/usr/local/bin/python3
import sqlite3

conn = sqlite3.connect("test.db")
cursor = conn.cursor()

cursor.execute("INSERT INTO HUMAN (ID,NAME,AGE) VALUES (2,'測試',17)")

id = 3
iname = 'fstring'
iage = 18

stmt = f"INSERT INTO HUMAN (ID,NAME,AGE) VALUES ({id}, '{iname}', {iage})"
print(stmt)
cursor.execute(stmt)

conn.commit()
conn.close()

https://ithelp.ithome.com.tw/upload/images/20210309/20050647Lsq4XlIHVE.png

s4028600 iT邦新手 5 級 ‧ 2021-03-10 07:28:31 檢舉

原來字串還是要打冒號
感謝

froce iT邦大師 1 級 ‧ 2021-03-10 08:35:04 檢舉

那個問號能夠用f-string之類的寫法嗎

字串拼接的方式要注意sql injection。

https://docs.python.org/zh-tw/3/library/sqlite3.html
通常你的 SQL 操作需要使用一些 Python 变量的值。你不应该使用 Python 的字符串操作来创建你的查询语句,因为那样做不安全;它会使你的程序容易受到 SQL 注入攻击(在 https://xkcd.com/327/ 上有一个搞笑的例子,看看有什么后果)

推荐另外一种方法:使用 DB-API 的参数替换。在你的 SQL 语句中,使用 ? 占位符来代替值,然后把对应的值组成的元组做为 execute() 方法的第二个参数。

也就是一開始一級屠豬士大提供的方式。

謝謝 froce 補充.
建議 s4028600 可以參考 froce 提供的
官方文件連結,裡面有些參考程式.

我要發表回答

立即登入回答