Чтобы обновить foo
значениями из другой таблицы, вы можете использовать вложенное выражение SELECT. Обратите внимание, что foo.rowid
относится к rowid внешней таблицы, а t.rowid
относится к rowid внутренней таблицы:
cur_2.execute( '''\
UPDATE foo SET bar = bar +
IFNULL( (SELECT t.bar
FROM db_1.foo AS t
WHERE foo.rowid = t.rowid), 0)''' )
Чтобы проверить, что соответствующие rowids
действительно сопоставляются, я немного изменил ваш код, чтобы rowids
из db_1.foo
не совпадало с rowids
из db_2.foo
:
import sqlite3
# Create db_1, populate it and close it:
open( 'db_1.sqlite', 'w+' )
db_1 = sqlite3.connect( 'db_1.sqlite' )
db_1.execute( 'CREATE TABLE foo(bar INTEGER)' )
db_1.execute( 'INSERT INTO foo (rowid,bar) VALUES (2,1)' )
db_1.execute( 'INSERT INTO foo (rowid,bar) VALUES (3,2)' )
db_1.commit()
db_1.close()
# Create db_2:
open( 'db_2.sqlite', 'w+' )
db_2 = sqlite3.connect( 'db_2.sqlite' )
cur_2 = db_2.cursor()
cur_2.execute( 'CREATE TABLE foo(bar INTEGER)' )
# Attach db_1 to db_2 connection:
cur_2.execute( 'ATTACH "db_1.sqlite" AS db_1' )
# Populate db_2 from db_1:
cur_2.execute( 'INSERT INTO foo SELECT * FROM db_1.foo' )
Обратите внимание, что rowids
из foo
равны 1 и 2:
cur_2.execute( 'SELECT rowid,bar from foo' )
for result in cur_2.fetchall():
print('foo: {0}'.format(result))
# foo: (1, 1)
# foo: (2, 2)
Обратите внимание, что rowids
из db_1.foo
равны 2 и 3:
# Show that db_1.foo.bar exists:
cur_2.execute( 'SELECT rowid,bar from db_1.foo' )
for result in cur_2.fetchall():
print('db_1.foo: {0}'.format(result))
# db_1.foo: (2, 1)
# db_1.foo: (3, 2)
cur_2.execute( '''\
UPDATE foo SET bar = bar +
IFNULL( (SELECT t.bar
FROM db_1.foo AS t
WHERE foo.rowid = t.rowid), 0)''' )
После ОБНОВЛЕНИЯ строка с rowid = 1 не изменилась,
в то время как строка с rowid = 2 была обновлена.
cur_2.execute( 'SELECT rowid,bar from foo' )
for result in cur_2.fetchall():
print('foo after update: {0} '.format(result))
# foo after update: (1, 1)
# foo after update: (2, 3)
cur_2.execute('DETACH db_1')
db_2.commit()
db_2.close()
Я нашел эти страницы полезными при построении этого ответа: здесь и здесь , хотя любые ошибки, конечно, мои собственные.