2017-01-19 32 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函數。所以通常這裏還有另一個未知的變量。