SQLAlchemy无法使用主键反映表

时间:2018-10-18 17:40:22

标签: python orm sqlalchemy flask-sqlalchemy

这些是类:

class User(db.Model):
    __tablename__ = 'Users'
    UserID = db.Column(
        db.Integer,
        primary_key=True,
        autoincrement=True,
        nullable=False
    )
    FirstName = db.Column(db.String(255), nullable=False)
    LastName = db.Column(db.String(255), nullable=False)
    Username = db.Column(db.String(255), nullable=False)
    Password = db.Column(db.String(255), nullable=False)

class UserType(db.Model):
    __tablename__ = 'UserTypes'
    TypeID = db.Column(
        db.Integer,
        primary_key=True,
        autoincrement=True,
        nullable=False
    )
    Type = db.Column(db.String(255), nullable=False)

    __table_args__ = (
        db.CheckConstraint(
            "Type IN ('Role1', 'Role2', 'Role3')"
        ),
    )


class UserPrivilege(db.Model):
    __tablename__ = 'UserPrivileges'
    UserID = db.Column(db.Integer, primary_key=True)
    UserTypeID = db.Column(db.Integer, primary_key=True)

    __table_args__ = (
        db.ForeignKeyConstraint(
            ['UserID'],
            ['Users.UserID'],
        ),
        db.ForeignKeyConstraint(
            ['UserTypeID'],
            ['UserTypes.TypeID'],
        ),
    )

    PrivilegeUserInfoBackref = db.relationship(
        'User',
        backref='PrivilegeUserInfoBackref',
        lazy=True,
    )
    PrivilegeUserTypeInfoBackref = db.relationship(
        'UserType',
        backref='PrivilegeUserTypeInfoBackref',
        lazy=True,
    )

这是反映表格的代码:

Base = automap_base()
engine = sa.create_engine(
    DATABASE_CONNECTION,
    convert_unicode=True,
    pool_size=10,
    max_overflow=20
)
db_session = scoped_session(sessionmaker(autocommit=False,
                                         autoflush=False,
                                         bind=engine))
Base.prepare(engine, reflect=True)

“用户”和“用户类型”类出现在Base.classes._data中,但由于某些原因,“ UserPrivileges”没有出现在Base.classes._data中。我设法找到的是没有主键的表无法反映出来,但是正如您所看到的,这里不是这种情况。我还有其他一些表,这些表具有带主引用的复合主键,但是没有问题。

那么,请问有人能给我任何建议以反映上一张表格吗?

1 个答案:

答案 0 :(得分:0)

UserPrivilege创建的表在many-to-many relationship's "secondary" table的所有方框中打勾,因此在使用自动映射扩展名时不会直接映射。 "Basic Use"的注释中也解释了此行为:

  

通过可行,我们的意思是要映射的表必须指定一个主键。此外,如果检测到该表是其他两个表之间的纯关联表,则不会直接映射该表,而是将其配置为两个引用表的映射之间的多对多表。

您的表应以Base.metadata.tables['UserPrivileges']的形式存在。