我已经从sqllite表创建了一个tmp表,该表是基于各种选择标准的原始表的子集。屏幕截图中有一个示例。
我试图一次遍历表记录,以便更新每个记录中的字段。我遇到了Mapper could not assemble any primary key columns中详述的问题。根据{{3}}的建议。根据这个讨论,我确实有一个候选键,它是一个唯一的ID:列' id'。因此,我已将代码更改为:
source_table= self.source
engine = create_engine(db_path)
Base = declarative_base()
# metadata = Base.metadata
# Look up the existing tables from database
Base.metadata.reflect(engine)
# Create class that maps via ORM to the database table
table = type(source_table, (Base,), {'__tablename__': source_table}, __mapper_args__ = {
'primary_key':'id'
})
Session = sessionmaker(bind=engine)
session = Session()
i = 0
for row in session.query(table).limit(500):
i += 1
print object_as_dict(row)
但是这给了:
TypeError: type() takes 1 or 3 arguments
如何使用 mapper_args 参数将id标识为主键
编辑:
我试过了:
table = type(source_table, (Base,), {'__tablename__': source_table}, {"__mapper_args__": {"primary_key": [Base.metadata.tables[source_table].c.id]}})
,并提供:
TypeError: type() takes 1 or 3 arguments
答案 0 :(得分:2)
__mapper_args__
需要是在类上定义的属性。而你需要写
class Foo(Base):
...
__mapper_args__ = {...}
在使用class
语法定义类时,需要编写
type("Foo", (Base,), {..., "__mapper_args__": {...}})
定义具有type
函数的类时。
请注意,__mapper_args__
可能需要
{"primary_key": [Base.metadata.tables[source_table].c.id]}
而不是
{"primary_key": "id"}
让它正常工作。