如何动态创建SQLAlchemy列

16 投票
1 回答
23234 浏览
提问于 2025-04-16 09:53

我有一个csv文件,第一行是字段名,后面的行是数据。现在我想用这个文件创建一个表格。因为字段名比较长,而且可能会有变化,所以我想动态地创建这个表格。

经过几次尝试和搜索,我想也许可以通过工厂模式生成一个类,然后把属性分配给这个新类,这样就能生成动态的列。但是这个方法失败了。根据错误信息,我又尝试了其他一些方法,但都没有成功。请帮帮我。我在考虑这个想法是否可行。

Reader = csv.reader(open('Book1.csv', 'rb'), delimiter=',', quotechar='|')
TableItem = Reader.next()[0:]
def Factory(*args, **kwargs):
    args=args[0]
    def init(self, *iargs, **ikwargs):
        #setattr(self,__tablename__,ikwargs[__tablename__])
        for k,v in kwargs.items():
            setattr(self, k, v)
        for i in range(len(iargs)):
            setattr(self, args[i], iargs[i])
        for k,v in ikwargs.items():
            setattr(self, k, v)

    name = kwargs.pop("name", "myFactory")
    kwargs.update(dict((k, None) for k in args))
    return type(name, (object,), {'__init__': init})

LIS=Factory(TableItem)
class newLIS(LIS,Base):
    __tablename__='testonly'
    pass
mytest=[]
for row in Reader:
    mytest.append(newLIS(row))

错误信息大概是:

sqlalchemy.exc.ArgumentError: Mapper Mapper|newLIS|testonly could not assemble
any primary key columns for mapped table 'testonly'

1 个回答

13

我是相关答案的作者:

sqlalchemy 动态映射

我还有一个答案,觉得和这个问题更相关,甚至可能是重复的:

用脚本语言动态创建数据库

正如你所看到的,要实现这个功能,你需要创建一个表对象,并将其与类进行映射。此外,在sqlalchemy中,映射的类需要在表中有一个主键,所以你得添加一个。除了这个问题,你还有其他问题吗?如果有的话,可以把你更新后的代码贴出来吗?

撰写回答