创建表实例时在sqlalchemy中创建主键

时间:2017-06-21 14:11:48

标签: python sqlalchemy

enter image description here

我已经从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

1 个答案:

答案 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"}

让它正常工作。