Python脚本在两个不同的数据库中区分相同的表

时间:2011-03-30 11:20:53

标签: python sqlalchemy

我即将编写一个python脚本来帮助我在同一个应用程序的不同版本之间迁移数据。

在我开始之前,我想知道是否有一个脚本或模块做了类似的事情,我可以使用,或者至少作为自己滚动的起点。我们的想法是在特定表之间区分数据,然后将diff存储为要应用于早期版本数据库的SQL INSERT语句。

注意:面对架构更改,此脚本不健壮

一般来说,逻辑就像

那样
def diff_table(table1, table2):
    # return all rows in table 2 that are not in table1
    pass

def persist_rows_tofile(rows, tablename):
    # save rows to file
    pass

dbnames=('db.v1', 'db.v2')
tables_to_process = ('foo', 'foobar')

for table in tables_to_process:
    table1 = dbnames[0]+'.'+table
    table2 = dbnames[1]+'.'+table
    rows = diff_table(table1, table2)

    if len(rows):
        persist_rows_tofile(rows, table)

这是编写此类脚本的好方法还是可以改进?我怀疑它可以通过缓存数据库连接等来改进(我遗漏了 - 因为我对SqlAlchemy等不太熟悉)。

有关如何添加SqlAlchemy以及通常改进此类脚本的任何提示吗?

2 个答案:

答案 0 :(得分:0)

要在两个数据库之间移动数据,我使用pg_comparator。这就像sql的diff和patch!您可以使用它来交换列的顺序,但如果您需要拆分或合并列,则需要使用其他内容。

我也用它来异步复制数据库。 cron作业每五分钟运行一次,并将“master”数据库上的所有更改推送到“slave”数据库。如果你只需要分发一个表,或者不是每个表的所有列等,都特别方便。

答案 1 :(得分:0)

我今天早些时候遇到了同样的问题,我发现本指南对复制数据库非常有帮助。

http://www.tylerlesmann.com/2009/apr/27/copying-databases-across-platforms-sqlalchemy/

根据您的需要,我怀疑您需要实际区分两个表。 merge()很神奇。