【问题标题】:SQLAlchemy Many-to-Many Users, Groups, RolesSQLAlchemy 多对多用户、组、角色
【发布时间】:2018-03-31 15:59:28
【问题描述】:

我正在尝试与用户-组-角色表结构集成,其中用户可以属于许多组并且在每个组中具有多个角色。

我发现了一个与此类似的问题,但它不允许多个角色:Many-to-many declarative SQLAlchemy definition for users, groups, and roles

我有以下表结构,并希望能够通过以下方式访问角色:user.groups[0].roles

class Role(Base):
    __tablename__ = 'roles'
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(Unicode(16), unique=True)

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(Unicode(16), unique=True)

class Group(Base):
    __tablename__ = 'groups'
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(Unicode(16), unique=True)

class UserGroup(Base):
    __tablename__ = 'user_group_role'
    id = Column(Integer, primary_key=True, autoincrement=True)
    user_id = Column(Integer, ForeignKey('users.id', ondelete='CASCADE'), nullable=False)
    group_id = Column(Integer, ForeignKey('groups.id', ondelete='CASCADE'), nullable=False)
    role_id = Column(Integer, ForeignKey('roles.id', ondelete='CASCADE'), nullable=False)

【问题讨论】:

    标签: python sql sqlalchemy many-to-many


    【解决方案1】:

    这是来自Turbogears'默认全栈快速入门的示例。

    from sqlalchemy import Table, ForeignKey, Column
    from sqlalchemy.types import Unicode, Integer, DateTime
    from sqlalchemy.orm import relation, synonym
    
    from .model import DeclarativeBase, metadata, DBSession
    
    
    # This is the association table for the many-to-many relationship between
    # groups and permissions.
    group_permission_table = Table('tg_group_permission', metadata,
                               Column('group_id', Integer,
                                      ForeignKey('tg_group.group_id',
                                                 onupdate="CASCADE",
                                                 ondelete="CASCADE"),
                                      primary_key=True),
                               Column('permission_id', Integer,
                                      ForeignKey('tg_permission.permission_id',
                                                 onupdate="CASCADE",
                                                 ondelete="CASCADE"),
                                      primary_key=True))
    
    
    # This is the association table for the many-to-many relationship between
    # groups and members - this is, the memberships.
    user_group_table = Table('tg_user_group', metadata,
                         Column('user_id', Integer,
                                ForeignKey('tg_user.user_id',
                                           onupdate="CASCADE",
                                           ondelete="CASCADE"),
                                primary_key=True),
                         Column('group_id', Integer,
                                ForeignKey('tg_group.group_id',
                                           onupdate="CASCADE",
                                           ondelete="CASCADE"),
                                primary_key=True))
    
    
    class Group(DeclarativeBase):
        __tablename__ = 'tg_group'
    
        group_id = Column(Integer, autoincrement=True, primary_key=True)
        group_name = Column(Unicode(16), unique=True, nullable=False)
        users = relation('User', secondary=user_group_table, backref='groups')
    
    class User(DeclarativeBase):
        __tablename__ = 'tg_user'
    
        user_id = Column(Integer, autoincrement=True, primary_key=True)
        user_name = Column(Unicode(16), unique=True, nullable=False)
        email_address = Column(Unicode(255), unique=True, nullable=False)
        display_name = Column(Unicode(255))
    
    
    class Permission(DeclarativeBase):
        __tablename__ = 'tg_permission'
    
        permission_id = Column(Integer, autoincrement=True, primary_key=True)
        permission_name = Column(Unicode(63), unique=True, nullable=False)
        description = Column(Unicode(255))
    
        groups = relation(Group, secondary=group_permission_table,
                      backref='permissions')
    

    【讨论】:

    • 虽然我喜欢这种结构,但我必须集成到现有的具有上述结构的表中。
    猜你喜欢
    • 2011-06-19
    • 2017-04-16
    • 2017-05-17
    • 1970-01-01
    • 2017-09-21
    • 2012-03-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多