寫入的動作通常會盡量在一次連接寫入,用 executemany。
效能的差距會很巨大,尤其是資料量大的時候。
import csv
import sqlite3
connect = sqlite3.connect("ren99.db")
i = connect.cursor()
# i.execute("drop table if exists shiharai")
i.execute("create table IF NOT EXISTS shiharai(id int,name char(20),total int,memo char(30))")
recordList = []
while True:
num = int(input("id = "))
name = input("name = ")
total = int(input("total = "))
memo = input("memo = ")
print([num,name,total,memo])
recordList.append((num,name,total,memo))
n = int(input("date insert yes=0 no=1 "))
if n == 1:
break
insertSql = "insert into shiharai(id,name,total,memo) VALUES (?,?,?,?) RETURNING id"
i.executemany(insertSql , recordList)
connect.commit()
# 利用ID選取插入之結果
insertedIDs = tuple(rec[0] for rec in recordList)
# 利用in查詢,因為程式語言限制,必須先產生有跟插入筆數一樣的參數的sql
# 例如插入2筆,要查詢的話就得生出 select * from shiharai where id in (?,?) order by id asc 這樣的查詢語句
selectSql = "select * from shiharai where id in (%s) order by id asc" %','.join('?'*len(insertedIDs))
for row in i.execute(selectSql, insertedIDs):
print(row)
這是因為你的 while-loop 流程,在新的 while-loop 時,將舊的 while-loop 的變數資料洗掉啊。
我臨時想到的處理法:
drop table if exists
的方式,感覺這方案比較適合。)其他方法就看你有沒疑問或有沒其他人提出建議了~
(畢竟是你的練習,沒必要說太多)
P.s. 暫存資料的簡單範例(小改自你的部分程式碼):
## 把資料暫存在記憶體,在 date-insert-no 後列印資料;
myData = list() ## 儲存紀錄用;
##
while True:
## 我這邊用 tuple 存資料組;你有需要時亦可用 dict;
## structureLabel:(id,name,total,memo)
myData.append((
int(input("id = ")),
input("name = "),
int(input("total = ")),
input("memo = "),
)) ## 看到 "int(input())" ,很想用 try-except 處理意外……
print(list(myData[-1])) ## 因為範例的輸出是方括弧,所以轉為 list 給 print();
while True: ## 這是限制輸入條件用的(因為我常手殘~);
n = input("date insert yes=0 no=1 ")
if n == '0' or n == '1': break
if n == '1': break
##
for i in myData: print(i)
##
另,雖說你很用心的附圖,還請學下 iT邦幫忙 這裡使用的 Markdown 語法。
(尤其是「程式碼與語法高亮標記」部分。)