如何使用 Peewee 查询几个相似的数据库?
Posted
技术标签:
【中文标题】如何使用 Peewee 查询几个相似的数据库?【英文标题】:How to query several similar databases using Peewee? 【发布时间】:2013-11-15 14:56:21 【问题描述】:我遇到了一个关于使用 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 能够处理这类情况吗?如果是这样,该怎么做?片段将不胜感激^^ 谢谢。
【问题讨论】:
【参考方案1】:Next 可能不是您的问题的确切答案,但我自己尝试过 - 成功 - 为我想要使用的每个模式使用 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 也应该为此目的添加一个额外的标志。
【讨论】:
【参考方案2】:我觉得这种方式比较简单:
import modelsA as A
import modelsB as B
ca = A.Customers.get(A.Customers.customernumber == 12)
cb = B.Customers.get(B.Customers.customernumber == 12)
【讨论】:
以上是关于如何使用 Peewee 查询几个相似的数据库?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Flask SQLAlchemy amp;Peewee 的查询结果转换成 json
peewee.DataError:字符串或blob太大,如何增加peewee中的`DSQLITE_MAX_VARIABLE_NUMBER`?