【发布时间】:2018-12-12 17:53:40
【问题描述】:
我开始玩一些对象关系映射器(Pony ORM)。
在 Pony 中,所有实体定义都继承自 db.Entity 类。然而,为了做到这一点,db 对象当然需要先在某个地方创建。 (db.Entity 有点类似于 sqlalchemy 中的声明性基础,所以我相信我下面的问题对于 sqlalchemy 也同样有效)
我在 Pony ORM 文档中看到的所有示例都显示了内联示例,其中数据库对象 db 只是在声明实体之前在解释器提示中声明。
这给我留下了一个问题:我应该在“真实”项目中的哪里创建我的 db 对象?
特别考虑我想将我的实体定义与我实际使用这些实体的位置分开的情况(比如我只想构建一个不错的 ORM 包装器包来访问数据库,然后应该在多个不同的其他项目中使用它)。然后我可能希望用户提供自己的 db 对象,该对象根据他们的需要进行配置,以便访问数据库。
一些示例代码:
假设我有一个存储 persons 和 addresses 的数据库,我的包 my_orm 应该为数据库提供 ORM,然后将在 app.py 中使用:
my_orm/init.py
from my_orm.person import Person
from my_orm.address import Address
my_orm/person.py:
from pony.orm import Required
class Person(db.Entity): # Where should `db` be defined?
name = Required(str)
age = Required(int)
my_orm/address.py:
from pony.orm import Required
class Address(db.Entity): # Where should `db` be defined?. Must be the same `db` object as in person.py
street_name = Required(str)
zip_code = Required(int)
app.py
from pony.orm import Database
db = Database()
import my_orm
除了看起来很丑,因为它将导入与数据库的创建混合在一起,这也会引发错误NameError: name 'db' is not defined。那我应该怎么做呢?
【问题讨论】:
标签: python orm sqlalchemy ponyorm