如何使用Peewee查询几个类似的数据库?

时间:2013-11-15 14:56:22

标签: python mysql orm peewee

我遇到了使用Peewee查询多个数据库的问题:

  • 我有2个现有的mysql数据库(让他们将它们命名为A和B)(结构类似,因为它是两个Bugzilla数据库)
  • 我使用Pwiz
  • 生成模型(modelsA.py和modelsB.py)
  • 我写了这段代码:

from modelsA import *
from modelsB import *

问题是:因为modelsB中的类(有时)与modelsA,modelsB类和#34;覆盖"相同。 modelsA类,无法查询A.

此外,我不了解如何查询其中一个特定数据库。 例如,使用以下代码:

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

您如何知道此查询将在哪个数据库执行?

我有个主意,但对我来说似乎很脏: 我可以手动重命名modelsA.py和modelsB.py中的类来区分它们然后编写这段代码:

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

粗略地说,Peewee能够处理这类案件吗?如果是这样,该怎么办?片段将非常赞赏^^ 感谢。

2 个答案:

答案 0 :(得分:2)

接下来可能不是你的问题的答案,但我自己尝试 - 成功 - 为我想要使用的每个模式使用 playhouse.Proxy 实例,并参考相应的代理在内部类Meta。我想这也可以在没有代理的情况下工作。但是,您似乎正在寻找跨架构查询,并且已经找到了我刚才想出的内容。

#!/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手工生成代码来实现。我确信有一种更优雅的 lazy (即不急于)这样做的方式,使用某种工厂,但是我没有花太多时间在Python和PeeWee上。如果是这样,pwiz.py也应该有一个额外的标志,我想。

答案 1 :(得分: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)