2013-11-15 68 views
2

我被困了有關查詢使用Peewee多個數據庫的問題:如何使用Peewee查詢幾個類似的數據庫?

  • 我有2個現有的MySQL數據庫(讓我們命名他們A和B)(結構是相似的,因爲它是由兩個的Bugzilla數據庫)
  • 我使用Pwiz
  • 生成模型(modelsA.py和modelsB.py)我寫這篇文章的代碼:

from modelsA import * 
from modelsB import * 

的問題是:在modelsB的類(有時)比modelsA相同,modelsB班「覆蓋」 modelsA類,不可能進行查詢A.

另外,我不明白如何查詢某個特定的數據庫。 例如,使用此代碼:

c = Customers.get(Customers.customernumber == 12) 

你怎麼知道哪個數據庫是要去執行這個查詢?

我有一個想法,但似乎骯髒對我說: 我可以手動從modelsA.py和modelsB.py重命名類,使他們distincts然後寫這樣的代碼:

ca = CustomersA.get(CustomersA.customernumber == 12) 
cb = CustomersB.get(CustomersB.customernumber == 12) 

粗略地講,是Peewee能夠處理這種情況?如果是這樣,那麼該怎麼辦?片段將非常讚賞^^ 謝謝。

回答

2

下一頁也許是不準確的回答你的問題,但我嘗試過自己 - 成功地 - 使用對每個模式我想使用playhouse.Proxy實例,並參考相應的代理在內部類元。我想這可以在沒有代理的情況下運行。但是,似乎你正在尋找跨模式查詢,並且已經知道我剛纔想出了什麼。

#!/usr/bin/python 

import sqlite3 
import peewee 
from peewee import * 
from playhouse.proxy import * 

database_a_proxy = Proxy() 
database_b_proxy = Proxy() 

class BaseModelA(Model): 
    class Meta: 
      database = database_a_proxy 

class BaseModelB(Model): 
    class Meta: 
      database = database_b_proxy 

class RelationInSchemaA(BaseModelA): 
    textfield = CharField() 

class RelationInSchemaB(BaseModelB): 
    textfield = CharField() 

database_a = SqliteDatabase('schemaA', **{}) 
database_b = SqliteDatabase('schemaB', **{}) 

database_a_proxy.initialize(database_a) 
database_b_proxy.initialize(database_b) 

try: 
    RelationInSchemaA.create_table() 
    RelationInSchemaB.create_table() 
except: 
    pass 

RelationInSchemaA.create(textfield='Hello') 
RelationInSchemaB.create(textfield='PeeWee') 

那麼,這是可能的手工生成的代碼從pwiz.py.我確信有一種更優雅的方式可以使用某種工廠來實現這一點,但我沒有花太多時間在Python和PeeWee上。如果是這樣,我想,pwiz.py應該有一個額外的標誌用於這個目的。

1

我覺得這種方式比較簡單:

import modelsA as A 
import modelsB as B 

ca = A.Customers.get(A.Customers.customernumber == 12) 
cb = B.Customers.get(B.Customers.customernumber == 12) 
相關問題