iT邦幫忙

0

重複發文

  • 分享至 

  • xImage

已解決

????改文幹嘛
re.Zero iT邦研究生 5 級 ‧ 2023-01-24 16:30:44 檢舉
可能怕東窗事發吧~(? XD
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
froce
iT邦大師 1 級 ‧ 2023-01-22 22:20:15
最佳解答

寫入的動作通常會盡量在一次連接寫入,用 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)
0
Oo_花之舞__oO
iT邦新手 1 級 ‧ 2023-01-21 11:13:51

你應該是在命令行的編譯執行?

試試在互動視窗執行

點右鍵去選

1
re.Zero
iT邦研究生 5 級 ‧ 2023-01-21 13:34:04

這是因為你的 while-loop 流程,在新的 while-loop 時,將舊的 while-loop 的變數資料洗掉啊。

我臨時想到的處理法:

  1. 在每次迴圈就寫入資料。
  2. 建立暫存資料儲存每次迴圈所輸入的資料,結束輸入後再一次處理暫存資料。
    (看你使用 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 語法
(尤其是「程式碼與語法高亮標記」部分。)

我要發表回答

立即登入回答