从数据库中获取数据并重新写回
Get data from database and write it back in again
我通过读取 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:pw123@127.0.0.1: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: Unknown column 'None' in 'where clause'
不幸的是,我也有这样的问题,我删除数据后数据库中的ID不再从0开始,而是继续计数。
这是数据库的截图:
Screenshot Database
这是 Excel 文件的屏幕截图:
Screenshot Excel
提前致谢
c.fetchall() returns 需要在循环中解包的元组列表
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,
record_id
))
我看不出您使用 dehnung.get() 的任何原因。当您从字典中检索值时使用 .get() 函数,但 dehnung 似乎是一个列表(或数字?)。这可能会以某种意想不到的方式破坏您的代码并混淆 sql 引擎。
您正在此处打印该变量
print("Dehnung", dehnung)
如果这是您要插入的值,只需在接下来的 2 次使用它时删除 .get()。
您还需要解压变量“record_id”中的值。我建议您将此变量重命名为“record”,因为它不是 record_id - 它是数据库结果的一行,它包含该行的所有值,而 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] 而不是记录 [1]。同样,我强烈建议您将变量“record_id”重命名为“record”,这似乎是一些混乱的根源
是的,它有效!
因为我忘记了 conn.commit()
中的括号,所以它没有用
这是我从@vinzBad 那里得到的新代码
def update():
c.execute("SELECT * FROM zugversuch_probe_1")
for record in c.fetchall():
try:
record_id, probe_dehnung, dehnung, probe_standardkraft = record
dehnung = (probe_dehnung / 0.123) * 100
c.execute("""UPDATE zugversuch_probe_1 SET
Dehnung = %s
WHERE ID = %s""",
(
dehnung,
record_id
))
conn.commit()
except mariadb.Error as e:
print(f"Error connecting to MariaDB Platform: {e}")
sys.exit(1)
conn.close()
这是截图mariadb
感谢您的帮助!
我通过读取 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:pw123@127.0.0.1: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: Unknown column 'None' in 'where clause'
不幸的是,我也有这样的问题,我删除数据后数据库中的ID不再从0开始,而是继续计数。
这是数据库的截图: Screenshot Database
这是 Excel 文件的屏幕截图: Screenshot Excel
提前致谢
c.fetchall() returns 需要在循环中解包的元组列表
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,
record_id
))
我看不出您使用 dehnung.get() 的任何原因。当您从字典中检索值时使用 .get() 函数,但 dehnung 似乎是一个列表(或数字?)。这可能会以某种意想不到的方式破坏您的代码并混淆 sql 引擎。
您正在此处打印该变量
print("Dehnung", dehnung)
如果这是您要插入的值,只需在接下来的 2 次使用它时删除 .get()。
您还需要解压变量“record_id”中的值。我建议您将此变量重命名为“record”,因为它不是 record_id - 它是数据库结果的一行,它包含该行的所有值,而 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] 而不是记录 [1]。同样,我强烈建议您将变量“record_id”重命名为“record”,这似乎是一些混乱的根源
是的,它有效!
因为我忘记了 conn.commit()
这是我从@vinzBad 那里得到的新代码
def update():
c.execute("SELECT * FROM zugversuch_probe_1")
for record in c.fetchall():
try:
record_id, probe_dehnung, dehnung, probe_standardkraft = record
dehnung = (probe_dehnung / 0.123) * 100
c.execute("""UPDATE zugversuch_probe_1 SET
Dehnung = %s
WHERE ID = %s""",
(
dehnung,
record_id
))
conn.commit()
except mariadb.Error as e:
print(f"Error connecting to MariaDB Platform: {e}")
sys.exit(1)
conn.close()
这是截图mariadb
感谢您的帮助!