PonyORM 数据库 Table 动态定义

PonyORM Database Table Dynamic Definition

据我所做的研究所知,在 Python 中使用 PonyORM 定义 table 的典型方法如下所示:

from pony.orm import *
db = Database()
# Database connection ...
class SampleTable(db.entity):
    sample_int_field = Required(int)
    sample_string_field = Required(str)
    # ...
db.generate_mapping(create_tables=True)

我的问题:这使用了db.entity

我希望定义一个table而不使用特定的数据库实例以抽象的一般方式,并连接它在我需要的时候给实例。

有办法吗?

概念(大概不是真正的可运行代码):


# SampleAbstractTable.py

from pony.orm import *
class SampleAbstractTable(Database):  
    sample_int_field = Required(int)
    sample_string_field = Required(str)
    # ...

# main.py

from pony.orm import *
import SampleAbstractTable
db = Database()
# Database connection ...
db.connectTables((SampleAbstractTable.SampleAbstractTable, ...))
db.generate_mapping(create_tables=True)

编辑:

我的一个想法是为我希望与某组 table 一起使用的数据库创建一个包装器 class,并在 init 中定义 table ,因为我希望动态定义 tables 的全部意义在于将数据库实例创建与 table classes 的定义分开,即:

from pony.orm import *
class sampleDatabase:
    def __init__(self):
        self._db = Database()
        # Database connection ...
        class TableA(db.entity):
            # ...
        class TableB(db.entity):
            # ...
        self._db.generate_mapping(create_tables=True)

但是我在访问数据库时遇到问题 tables...

首先,您使用的是实体,而不是表。它们不是一回事。

你的问题只要像factory这样定义函数就可以解决

def define_entities(db):
    class Entity1(db.Entity):
        attr1 = Required(str)
        ... and so on

然后稍后当您创建 Database 实例时,您只需调用

db = Database(...)
define_entities(db)