Python Peewee:在实例化模型时动态设置表名称

Python Peewee:在实例化模型时动态设置表名称,python,orm,peewee,Python,Orm,Peewee,我敢肯定这不是复制品。我知道我们可以使用以下方法“动态”设置表名: class DBmodel(Model) class Meta: database = db table_name = "foobar" 但是,如果每次实例化DBmodel时都要更改表的名称,该怎么办 例如考虑这个工作片段: #!/usr/bin/env python3 # coding: utf-8 from peewee import * conf = { "foo":

我敢肯定这不是复制品。我知道我们可以使用以下方法“动态”设置表名:

class DBmodel(Model)
    class Meta:
        database = db
        table_name = "foobar"
但是,如果每次实例化DBmodel时都要更改表的名称,该怎么办

例如考虑这个工作片段:

#!/usr/bin/env python3
# coding: utf-8

from peewee import *

conf = {
    "foo": {
        "foo1": "CharField(null=True)",
        "foo2": "CharField(null=True)"
    },
    "bar": {
        "bar1": "CharField(null=True)",
        "bar2": "CharField(null=True)"
    }
}

db = SqliteDatabase("foobar.db")


class DBmodel(Model):
    class Meta:
        database = db
        table_name = "foobar"


class Data:
    def __init__(self, conf):
        self.conf = conf
        self.DBmodel = DBmodel()
        for entry in self.conf:
            # I have to use eval because my conf is actually coming from parsed json, where I can only have text field
            self.DBmodel._meta.add_field(entry, eval(self.conf[entry]))


if __name__ == "__main__":
    dataFoo = Data(conf["foo"])
    dataBar = Data(conf["bar"])
    dataFoo.DBmodel.create_table()
    dataBar.DBmodel.create_table()
所以我得到:

$ sqlite3 foobar.db
SQLite version 3.22.0 2018-01-22 18:45:57
sqlite> .schema foobar
CREATE TABLE IF NOT EXISTS "foobar" ("id" INTEGER NOT NULL PRIMARY KEY, "foo1" VARCHAR(255), "foo2" VARCHAR(255), "bar1" VARCHAR(255), "bar2" VARCHAR(255));
但我想要两张这样的桌子:

$ sqlite3 foobar.db
SQLite version 3.22.0 2018-01-22 18:45:57
sqlite> .schema foo
CREATE TABLE IF NOT EXISTS "foo" ("id" INTEGER NOT NULL PRIMARY KEY, "foo1" VARCHAR(255), "foo2" VARCHAR(255));
sqlite> .schema bar
CREATE TABLE IF NOT EXISTS "bar" ("id" INTEGER NOT NULL PRIMARY KEY, "bar1" VARCHAR(255), "bar2" VARCHAR(255));

当然,我可以复制我的DBmodel并每次更改表的名称,但这看起来很难看。有更好的解决方案吗?

您始终可以使用内置类型动态声明类:

为什么数据必须是类?您可能只需要一个函数,该函数接受config dict的键,并返回一个新的类对象。你可能会想一想


我还将指出,这样做是一个坏主意。

代码中应该包含一些简要说明。
 # coding: utf-8
 from peewee import *
 db = SqliteDatabase("foobar.db")
 def get_table_name(model_class):
     return model_class.__name__

 def class_generator(class_name):
     value_dict = {}
     for i in range(2):
         value_dict['{}{}'.format(class_name, i+1)] = CharField(null=True)
     value_dict['Meta'] = type('Meta', (object, ), {'database': db, 'table_function': get_table_name})
     return type(class_name, (Model, ), value_dict)

 if __name__ == "__main__":
     dataFoo = class_generator("foo")
     dataBar = class_generator("bar")
     dataFoo.create_table()
     dataBar.create_table()
 # coding: utf-8
 from peewee import *
 db = SqliteDatabase("foobar.db")
 def get_table_name(model_class):
     return model_class.__name__

 def class_generator(class_name):
     value_dict = {}
     for i in range(2):
         value_dict['{}{}'.format(class_name, i+1)] = CharField(null=True)
     value_dict['Meta'] = type('Meta', (object, ), {'database': db, 'table_function': get_table_name})
     return type(class_name, (Model, ), value_dict)

 if __name__ == "__main__":
     dataFoo = class_generator("foo")
     dataBar = class_generator("bar")
     dataFoo.create_table()
     dataBar.create_table()