我有一个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'
答案 0 :(得分:12)
我是相关答案的作者:
我对另一个问题有这个答案,我认为这个问题更为相关 - 它甚至可能是重复的:
Database on the fly with scripting languages
正如您所看到的,为了实现这一点,您需要创建一个表对象并将其映射到您的类。另外,sqlalchemy中的映射类需要表上的主键,因此您必须添加一个。除此之外你还有其他问题吗?如果是这样,您可以粘贴更新的代码吗?