2

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

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

.

from modelsA import *
from modelsB import *

问题是:由于模型B 中的类(有时)与模型A 相同,模型B 类“覆盖”模型A 类,使得无法查询A。

此外,我不明白如何查询特定数据库之一。例如,使用以下代码:

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

你怎么知道这个查询将在哪个数据库上执行?

我有一个想法,但对我来说似乎很脏:我可以手动重命名 modelsA.py 和 modelsB.py 中的类以使它们不同,然后编写以下代码:

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

粗略地说,Peewee 能处理这种情况吗?如果是这样,该怎么做?片段将不胜感激^^谢谢。

4

2 回答 2

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 手工生成代码来实现。我相信还有一种更优雅和更懒惰(即不急切)的方式来做到这一点,使用某种工厂,但我还没有花太多时间在 Python 和 PeeWee 上。如果是这样,我猜 pwiz.py 也应该为此目的有一个额外的标志。

于 2013-12-09T13:38:46.763 回答
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)
于 2017-01-21T15:50:49.767 回答