SQLAlchemy не может отразить таблицу с первичным ключом - PullRequest
0 голосов
/ 18 октября 2018

Это классы:

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)

Классы «Users» и «UserTypes» появляются в Base.classes._data, но по некоторым причинам «UserPrivileges» не отображается в Base.classes._data.Все, что мне удалось найти, - это то, что таблицы без первичного ключа не могут быть отражены, но, как вы можете видеть, это не тот случай.У меня также есть еще несколько таблиц, которые имеют составной первичный ключ с обратными ссылками, но которые отражаются без проблем.

Итак, кто-нибудь может дать мне какие-либо предложения, чтобы отразить и последнюю таблицу, пожалуйста?

1 Ответ

0 голосов
/ 18 октября 2018

Таблица, созданная для UserPrivilege, помечает все поля «1002» «второй» таблицы отношения «многие-ко-многим» и поэтому не отображается напрямую при использовании расширения automap.Это поведение также объясняется в примечании «Основное использование» :

По жизнеспособным , мы имеем в виду, что для сопоставления таблицы она должнауказать первичный ключ.Кроме того, если таблица определяется как таблица чистой ассоциации между двумя другими таблицами, она не будет отображаться напрямую и вместо этого будет настроена как таблица «многие ко многим» между отображениями для двух ссылающихся таблиц.

Ваша таблица должна существовать как Base.metadata.tables['UserPrivileges'].

...