2017-01-19 31 views
1

我想复制多个数据库中的数据,处理它们,然后将它们移动到主数据库。所有的数据库都有相同的模式。Peewee ORM - 复制主数据库中的多个数据库中的数据

即使我打开和关闭数据库,peewee总是连接到同一个数据库(列表中的第三个),并且不尊重连接顺序。

databases = [spie_db, opticsorg_db, phcom_db] 


# map to a dictionary the values from the record 
def mapping(record): 
    comp_d = {'name': record.name, 
       'address': record.address, 
       'country': record.country, 
       'website': record.website, 
       'domain': record.domain 
       } 
    return comp_d 


def merge_data(): 
    company_list = [] 
    for database in databases: 
     database.connect() 
     # cycle trough db 
     for record in Company.select(): 
      # append each record to the list 
      company_list.append(mapping(record)) 
     database.close() 
    return company_list 


# get data from the other databases 
companies = merge_data() 
# the merge database 
db.connect() 
# add records in the merge db 
for company in companies: 

    Company.create(name=company['name'], address=company['address'], country=company['country'], 
        website=company['website'], domain=company['domain']) 

db.close() 

回答

1

你要手动设置模型的Meta选项数据库:

Company._meta.database = db 
db.connect() 
for company in companies: 

    Company.create(name=company['name'], address=company['address'], country=company['country'], 
        website=company['website'], domain=company['domain']) 
-1

这不适用于这个逻辑加上有更多的错误。

通常在merge_data函数中,公司Company.select()必须是未知变量。如果不是,这意味着你在导入程序的启动:

from spie_db import * 
from opticsorg_db import * 
from phcom_db import * 

因为所有3个数据库具有相同的表款所有你与这些import语句要做的就是导入只有phcom_db数据库(的车型opticsorg_db覆盖了spie_db的模型,phcom_db的模型覆盖了opticsorg_db的模型)。您只导入第三个数据库,因此peewee仅与第三个数据库连接。

另外,您不要将数据库变量(列表)设置为全局变量,也不会将它作为变量发送给merge_data函数。所以通常这里还有另一个未知的变量。