Python中的sqlite3:当主键相同时,通过另一个表中的列更新一个表中的列

时间:2015-06-16 21:48:42

标签: python sqlite

我想在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()

然而,我得到了一个操作错误。我知道这是我的语法,但就像我说我是新手,所以任何指导都非常感谢。

1 个答案:

答案 0 :(得分:1)

您需要的代码多于您拥有的代码。你的代码逻辑应该是这样的:

  1. 连接到sqlite db
  2. 在TABLE2上执行SELECT查询并获取行。称这行为。
  3. 对TABLE1执行SELECT查询并获取行。调用此行1。
  4. 对于rows1中的每个id,如果这个id存在于rows2中,则在TABLE1中对该特定id执行UPDATE。
  5. 您的代码中缺少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()