如何使用 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 查询几个相似的数据库?的主要内容,如果未能解决你的问题,请参考以下文章

如何将此查询转换为 Peewee ORM?

如何在 peewee 中预取?

如何将 Flask SQLAlchemy amp;Peewee 的查询结果转换成 json

`peewee`如何获取外键的父模型

Peewee:如何更新特定字段?

peewee.DataError:字符串或blob太大,如何增加peewee中的`DSQLITE_MAX_VARIABLE_NUMBER`?