我遇到了使用 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 中的类以使它们不同,然后编写以下代码:
ca = CustomersA.get(CustomersA.customernumber == 12)
cb = CustomersB.get(CustomersB.customernumber == 12)
大概来说,Peewee 能处理这种情况吗?如果是的话,有什么办法呢?片段将非常感激^^
谢谢。
接下来可能不是您问题的确切答案,但我自己尝试过 - 成功 - 正在使用剧场代理我想要使用的每个模式的实例,并引用内部类 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 (i.e. 不渴望)也可以使用某种工厂来做到这一点,但我还没有在 Python 和 PeeWee 上花太多时间。如果是这样,我想 pwiz.py 也应该为此目的有一个额外的标志。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)