2014-01-16 55 views
0

我是一名SQL新手,我有一个应用程序,我想通过一组格式为(p1,p2,id)的元组来迭代并将当前元组与前一个元组进行比较。通过SQL数据库迭代

如果当前的元组的p1匹配的p2前面:

  • 当前的元组p1被分配到以前的元组的p1
  • 以前的元组被删除

这里是一个例子,说明我的申请:

import sqlite3 as lite 

vectors = [ 
(1,2,1), 
(2,3,2), 
(3,4,3), 
(4,5,4), 
(6,7,5), 
(7,8,6), 
(8,9,7), 
(9,10,8), 
(11,12,9), 
(12,13,10), 
(13,14,11), 
(15,16,12) 
] 

### define database object and cursor objects 
vec_data = lite.connect('vecs.db') 

cur = vec_data.cursor() 
editor_cursor = vec_data.cursor() 

### put python objects in SQL 
cur.execute("DROP TABLE IF EXISTS vecs") 
cur.execute("CREATE TABLE vecs(p1,p2,id INTEGER PRIMARY KEY)") 
cur.executemany("INSERT INTO vecs VALUES(?, ?, ?)", vectors) 

### iterate through and 'merge' vecs 
cur.execute("SELECT * FROM vecs ORDER BY p1 ASC") 
old_vec = None 
while True: 

    try: 
     old_vec = vec 
    except NameError: 
     old_vec = None 

    vec = cur.fetchone() 
    if vec == None: 
     break 

    if (vec is not None) and (old_vec is not None): 

     old_vec_p1 = old_vec[0] 
     old_vec_p2 = old_vec[1] 
     vec_p1 = vec[0] 
     vec_id = vec[2] 
     old_vec_id = old_vec[2] 

     if (old_vec_p2 == vec_p1): 
      editor_cursor.execute("UPDATE vecs SET p1=? WHERE id=?",(old_vec_p1,vec_id)) 
      editor_cursor.execute("DELETE FROM vecs WHERE id=?",(old_vec_id,)) 

cur.execute("SELECT * FROM vecs")  
while True: 
    vec = cur.fetchone() 
    if vec == None: 
     break 
    print(vec) 

vec_data.close() 

...现在给我的投入,我想输出是:

(1, 5, 4) 
(6, 10, 8) 
(11, 14, 11) 
(15, 16, 12) 

...而是我得到:

(3, 5, 4) 
(8, 10, 8) 
(12, 14, 11) 
(15, 16, 12) 

什么,我想要做的当量(但纯粹在Python中完成)是:

vectors = [ 
[1,2,1], 
[2,3,2], 
[3,4,3], 
[4,5,4], 
[6,7,5], 
[7,8,6], 
[8,9,7], 
[9,10,8], 
[11,12,9], 
[12,13,10], 
[13,14,11], 
[15,16,12] 
] 

i=0 
while i < (len(vectors)-1): 
    vec = (vectors[i+1]) 
    old_vec = (vectors[i]) 

    old_vec_p1 = old_vec[0] 
    old_vec_p2 = old_vec[1] 
    vec_p1 = vec[0] 
    vec_id = vec[2] 
    old_vec_id = old_vec[2] 

    if (old_vec_p2 == vec_p1): 
     vectors[i+1][0] = old_vec_p1 
     del vectors[i] 
    else: 
     i += 1 


for i in vectors: 
    print i 

那么,我有一个SQL的误解,或者我有我的代码中的错误?

回答

1

vec = cur.fetchone()之后vec在你手中:你更新数据库中的行,但vec不会改变。

在数据库更改之后(或之前)添加vec = (old_vec_p1, vec[1], vec_id)

0
vecs = cur.execute("SELECT * FROM vecs ORDER BY p1 ASC") 
    old_vec = None 
    for vec in vecs: 
     if vec and old_vec: 
      old_vec_p1 = old_vec[0] 
      old_vec_p2 = old_vec[1] 
      vec_p1 = vec[0] 
      vec_id = vec[2] 
      old_vec_id = old_vec[2] 
      if (old_vec_p2 == vec_p1): 
       editor_cursor.execute("UPDATE vecs SET p1=? WHERE id=?",(old_vec_p1,vec_id)) 
       editor_cursor.execute("DELETE FROM vecs WHERE id=?",(old_vec_id,)) 
     old_vec = vec 

    vecs = cur.execute("SELECT * FROM vecs")  
    print vecs.fetchall() 
    vec_data.close() 

看起来像你的问题已经回答了,其中vec没有被更新。我喜欢看不同的解决方案,所以我希望这可以帮助你。您可以简单地迭代返回的行。


if vec and old_vec: 

类似于

if (vec is not None) and (old_vec is not None):