我想在Python中使用sqlite3。我有一个包含四列的表(id INT,other_no INT,位置TEXT,分类TEXT,PRIMARY KEY是id)。在此表中,用于分类的列保留为空,并将通过表2中的信息进行更新。请参阅下面的代码。然后我有一个有三列的第二个表。 (id INT,类TEXT,类型TEXT,PRIMARY KEY(id))。基本上,这两个表有两个共同的列。在两个表中,主键是id列,最终必须合并分类和类列。所以代码需要能够通过表2并且每当它在表1中找到匹配的id时,从表2的分类列更新类列(表1)。构建两个表的信息来自两个单独的文件。
# function to create Table1...
# function to create Table2...
(表格按预期创建)。当我尝试使用table2中的信息更新table1时,会发生此问题。
def update_table1():
con = sqlite3.connect('table1.db', 'table2.db') #I know this is wrong but if how do I connect table2 so that I don't get error that the Table2 global names is not defined?
cur = con.cursor()
if id in Table2 == id in Table1:
new_classification = Table2.class # so now instead of Null it should have the class information from table2
cur.execute("UPDATE Table1 SET class = ? WHERE id =? ", (new_classification, id))
con.commit()
但是,我得到了line2的错误:TypeError:需要一个float。我知道这是因为我在connect方法中放了两个参数。但是如果我只连接Table1,我得到错误Table2没有定义。
我读过这篇文章Updating a column in one table through a column in another table我理解它的逻辑,但我无法将SQL代码翻译成Python。我已经研究了一段时间,似乎无法得到它。你能帮忙吗?谢谢
在用户的评论之后我得到了这段代码,但它仍然不起作用:
#connect to the database containing the two tables
cur.execute("SELECT id FROM Table1")
for row in cur.fetchall():
row_table1 = row[0]
cur.execute("SELECT (id, class) FROM Table2")
for row1 in cur.fetchall():
row_table2 = row[0] #catches the id
row_table2_class = row[1] #catches the name
if row_table1 == row_table2:
print "yes" #as a test for me to see the loop worked
new_class = row_table_class
cur.execute("UPDATE Table1 SET classification=? WHERE id=?", (new_class, row_table1))
con.commit()
然而,我得到了一个操作错误。我知道这是我的语法,但就像我说我是新手,所以任何指导都非常感谢。
答案 0 :(得分:1)
您需要的代码多于您拥有的代码。你的代码逻辑应该是这样的:
您的代码中缺少SELECT查询:
cur = con.cursor()
if id in Table2 == id in Table1:
new_classification = Table2.class
你不能像这样直接测试。您需要先使用SELECT查询获取两个表中的行,然后才能按照自己的方式进行测试。
从上面发布的内容中查找以下修改过的代码。我刚刚直接在这里输入了代码,所以我没有机会测试它,但是你可以看看它以获得一个想法。这甚至可能会运行。
此外,这绝不是最有效的方法。这实际上非常笨重。特别是因为对于Table1中的每个id,您每次都要获取Table2的所有行以匹配。相反,您需要一次获取Table1的所有行,然后获取Table2的所有行,然后匹配它们。我将离开优化,让你更快地完成这项任务。
import sqlite3
#connect to the database containing the two tables
conn = sqlite3.connect("<PUT DB FILENAME HERE>")
cur = conn.execute("SELECT id FROM Table1")
for row in cur.fetchall():
row_table1_id = row[0]
cur2 = conn.execute("SELECT id, class FROM Table2")
for row1 in cur2.fetchall():
row_table2_id = row1[0] # catches the id
row_table2_class = row1[1] # catches the name
if row_table1_id == row_table2_id:
print "yes" # as a test for me to see the loop worked
new_class = row_table2_class
conn.execute("UPDATE Table1 SET classification=? WHERE id=?", (new_class, row_table1_id))
conn.commit()