首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用PonyORM动态创建实体?

如何使用PonyORM动态创建实体?
EN

Stack Overflow用户
提问于 2019-02-12 16:05:19
回答 1查看 911关注 0票数 0

我希望通过工厂方法在Pony中创建DB实体,以避免类似表的代码重复。

下面是我不完全工作的最低限度的例子:

代码语言:javascript
复制
from pony.orm import *


def factory(db, tablename):
    class TableTemplate(db.Entity):
        _table_ = tablename
        first_name = Required(str)
        last_name = Required(str)
        composite_index(first_name, last_name)
    return TableTemplate


db = Database(provider='sqlite', filename=':memory:')
Table1 = factory(db, "TABLE_1")

# the following line produces the exception:
#    pony.orm.core.ERDiagramError: Entity TableTemplate already exists
Table2 = factory(db, "TABLE_2")

db.generate_mapping(create_tables=True)
with db_session:
    Table1(first_name="foo", last_name="bar")

可以通过使用type创建具有动态名称的类来规避异常,但这并不适用于composite_index.

有什么好的方法来拥有一个小马ORM的桌子工厂吗?

EN

回答 1

Stack Overflow用户

发布于 2019-02-12 17:26:16

这是我对你们班工厂的看法:

代码语言:javascript
复制
def factory(db, tablename):
    fields = {
        '_table': tablename,
        'first_name': Required(str)
        # rest of the fields
    }
    table_template = type(tablename.capitalize(),(db.Entity,),fields)
    return table_template

这将通过在tablename中大写名称并设置描述符来创建类。不过,我不太确定元类

关于composite_index 的更新

composite_index通过调用此方法使用了一些非常模糊的特性:

代码语言:javascript
复制
def _define_index(func_name, attrs, is_unique=False):
    if len(attrs) < 2: throw(TypeError,
        '%s() must receive at least two attributes as arguments' % func_name)
    cls_dict = sys._getframe(2).f_locals
    indexes = cls_dict.setdefault('_indexes_', [])
    indexes.append(Index(*attrs, is_pk=False, is_unique=is_unique))

一个小小的实验告诉我,您可以通过自己添加字段来执行相同的操作。因此,这将使我们的工厂fields变量看起来如下:

代码语言:javascript
复制
fields = {
        '_table': tablename,
        'first_name': Required(str),
        '_indexes_':[Index(('first_name','last_name'),is_pk=False,is_unique=False)]
        # rest of the fields
    }

试试看让我知道。

OP实验的更新

最后的代码如下所示:

代码语言:javascript
复制
from pony.orm import *
from pony.orm.core import Index
def factory(db, tablename):
    fields = {
        '_table': tablename,
        'first_name': Required(str)
        # rest of the fields
    }
    fields['_indexes_'] = [Index(fields['first_name'],fields['last_name'],is_pk=False,is_unique=False)]
    table_template = type(tablename.capitalize(),(db.Entity,),fields)
    return table_template
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54654178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档