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

Python 如何使用PonyORM动态创建实体?,python,factory-pattern,ponyorm,Python,Factory Pattern,Ponyorm,我希望通过工厂方法在Pony ORM中创建DB实体,以避免类似表的代码重复 以下是我未完全工作的最简单示例: from pony.orm import * def factory(db, tablename): class TableTemplate(db.Entity): _table_ = tablename first_name = Required(str) last_name = Required(str) c

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

以下是我未完全工作的最简单示例:

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
创建具有动态名称的类,可以避免此异常,但这在
复合索引
中不起作用


有没有一个好方法可以让小马ORM拥有一个桌子工厂?

以下是我对你们班级工厂的看法:

def工厂(数据库,表名): 字段={ “_table”:表名, “名字”:必需(str) #其余的田地 } table_template=type(tablename.capitalize(),(db.Entity,),字段) 返回表模板 这将通过将
tablename
中的名称大写来创建一个类,并设置描述符。但是我不确定元类

综合指数的更新问题

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

def\u define\u索引(函数名attrs,is\u unique=False):
如果len(attrs)<2:throw(TypeError,
“%s()必须至少接收两个属性作为参数“%func\u name”)
cls\u dict=sys.\u getframe(2).f\u局部变量
索引=cls_dict.setdefault(“索引”,[])
追加(索引(*attrs,is_pk=False,is_unique=is_unique))
一些实验告诉我,你可以通过自己添加字段来执行同样的操作。这将使我们的工厂
字段
变量如下所示:

字段={
“_table”:表名,
“名字”:必填项(str),
“_indexes:[索引('first_name','last_name'),is_pk=False,is_unique=False)]
#其余的田地
}
试试看,让我知道

OP实验更新

最终的代码如下所示:

从pony.orm导入*
从pony.orm.core导入索引
def工厂(数据库,表名):
字段={
“_table”:表名,
“名字”:必需(str)
#其余的田地
}
字段[''索引]=[索引(字段['first\u name'],字段['last\u name'],is\u pk=False,is\u unique=False)]
table_template=type(tablename.capitalize(),(db.Entity,),字段)
返回表模板

以下是我对你们班级工厂的看法:

def工厂(数据库,表名): 字段={ “_table”:表名, “名字”:必需(str) #其余的田地 } table_template=type(tablename.capitalize(),(db.Entity,),字段) 返回表模板
这将通过将
tablename
中的名称大写来创建一个类,并设置描述符。但是我不确定元类

综合指数的更新
问题

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

def\u define\u索引(函数名attrs,is\u unique=False):
如果len(attrs)<2:throw(TypeError,
“%s()必须至少接收两个属性作为参数“%func\u name”)
cls\u dict=sys.\u getframe(2).f\u局部变量
索引=cls_dict.setdefault(“索引”,[])
追加(索引(*attrs,is_pk=False,is_unique=is_unique))
一些实验告诉我,你可以通过自己添加字段来执行同样的操作。这将使我们的工厂
字段
变量如下所示:

字段={
“_table”:表名,
“名字”:必填项(str),
“_indexes:[索引('first_name','last_name'),is_pk=False,is_unique=False)]
#其余的田地
}
试试看,让我知道

OP实验更新

最终的代码如下所示:

从pony.orm导入*
从pony.orm.core导入索引
def工厂(数据库,表名):
字段={
“_table”:表名,
“名字”:必需(str)
#其余的田地
}
字段[''索引]=[索引(字段['first\u name'],字段['last\u name'],is\u pk=False,is\u unique=False)]
table_template=type(tablename.capitalize(),(db.Entity,),字段)
返回表模板

谢谢,这是有效的,但不能解决使用
复合索引的问题
@jofel我更新了我的answe,试试看,让我知道谢谢更新。是否索引未公开,即ponyorm中的私有索引?我仍然需要尝试您的更新。我说:如果您希望您的属性是私有的,请使用
\uuuuu
我的错误命名它们,我需要来自pony.orm.core导入索引的
。另外,我需要使用
字段[''u Index']=[索引(字段['first\u name'],字段['last\u name'],is\u pk=False,is\u unique=False)]
-但它似乎可以工作。请您再次更新您的答案,然后我会接受。谢谢,这是有效的,但无法解决使用
composite_index
@jofel的问题。我更新了我的answe,尝试一下,让我知道谢谢更新。是否索引未公开,即ponyorm中的私有索引?我仍然需要尝试您的更新。我说:如果您希望您的属性是私有的,请使用
\uuuuu
我的错误命名它们,我需要来自pony.orm.core导入索引的
。另外,我需要使用
字段[''u Index']=[索引(字段['first\u name'],字段['last\u name'],is\u pk=False,is\u unique=False)]
-但它似乎可以工作。请你再更新一下你的答案,我会接受的。