我通過讀取excel檔案并將其寫入資料庫來撰寫一個函式。這有效!
從資料庫中獲取資料也有效。
我卡住的地方是函式應該讀取每一行,計算它并將結果寫回資料庫。
我還想找出資料庫中寫入了多少行,然后將該數字傳遞給 for 回圈。
第一個函式用于讀取Excel資料并將其寫入資料庫:
def Load_into_database():
file_path = label_file["text"]
try:
excel_filename = r"{}".format(file_path)
if excel_filename[-4:] == ".csv":
df = pd.read_csv(excel_filename, header=0, names=['Probe_Dehnung', 'Probe_Standardkraft'], sheet_name='Probe 1', skiprows=2, usecols="A:B")
else:
df = pd.read_excel(excel_filename, header=0, names=['Probe_Dehnung', 'Probe_Standardkraft'], sheet_name='Probe 1', skiprows=2, usecols="A:B")
except ValueError:
tk.messagebox.showerror("Information", "The file you have chosen is invalid")
return None
except FileNotFoundError:
tk.messagebox.showerror("Information", f"No such file as {file_path}")
return None
engine = create_engine("mariadb mariadbconnector://root:[email protected]:3306/polymer")
df.to_sql('zugversuch_probe_1',
con=engine,
if_exists='append',
index=False)
c.execute("SELECT * FROM zugversuch_probe_1")
records = c.fetchall()
print("Records", records)
calculation(records)
第二個函式是從一列中讀取每一行并逐行計算,然后將其寫回資料庫:
def calculation(records):
# query the database
for record_id in records:
c.execute("SELECT * FROM zugversuch_probe_1 WHERE ID = " str(record_id))
records = c.fetchall()[0]
# Berechnung Dehnung
dehnung = calc_dehnung(records[1])
print("Dehnung", dehnung)
sql_command = """
INSERT INTO zugversuch_probe_1
(Dehnung)
VALUES(%s)"""
c.execute("""UPDATE zugversuch_probe_1 SET
Dehnung = %s
WHERE ID = %s""",
(
dehnung.get(),
record_id
))
values = (dehnung.get())
# commit changes
conn.commit
# close connection
conn.close()
def calc_dehnung(value_list):
return (value_list[0] / 0.123) * 100
運行我的代碼后,我收到錯誤訊息:
c.execute("SELECT * FROM zugversuch_probe_1 WHERE ID = " str(record_id)) mariadb.OperationalError:'where 子句'中的未知列'None'
不幸的是,我也有問題,我洗掉資料后,資料庫中的ID沒有重新從0開始,而是繼續計數。
這是資料庫的截圖: 截圖資料庫
這是 Excel 檔案的螢屏截圖: Screenshot Excel
先感謝您
uj5u.com熱心網友回復:
c.fetchall() 回傳您需要在回圈中解壓的元組串列
c.execute("SELECT * FROM zugversuch_probe_1")
for record in c.fetchall():
record_id, probe_dehnung, dehnung, probe_standardkraft = record
dehnung = calc_dehnung(probe_dehnung)
c.execute("""UPDATE zugversuch_probe_1 SET
Dehnung = %s
WHERE ID = %s""",
(
dehnung.get(),
record_id
))
uj5u.com熱心網友回復:
我看不出您使用 dehnung.get() 的任何原因。當您從字典中檢索值時會使用 .get() 函式,但 dehnung 似乎是一個串列(或數字?)。這可能會以某種意想不到的方式破壞您的代碼并混淆 sql 引擎。
你在這里列印那個變數
print("Dehnung", dehnung)
如果那是您要插入的值,只需在接下來的 2 次使用它時洗掉 .get()。
您還需要從變數“record_id”中解壓縮值。我建議您將此變數重命名為“記錄”,因為它不是 record_id - 它是來自 db 的一行結果,其中包含該行中的所有值,而 id 只是其中之一(第一個)。您可以使用 record_id[0] 訪問它
c.execute("SELECT * FROM zugversuch_probe_1 WHERE ID = " str(record_id[0]))
您也可能在這里使用了錯誤的值:
dehnung = calc_dehnung(records[1])
您可能打算使用record_id[1] 而不是records[1]。同樣,我強烈建議您將變數“record_id”重命名為“record”,這似乎是造成一些混亂的根源
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/370198.html
