I had a SQLAlchemy model like -
<code>
class User(DeclarativeBase):
    __tablename__ = 'users'

    id = Column(BigInteger, primary_key=True)
    email = Column(String(100), unique=True, nullable=False)
    name = Column(String(100), nullable=False)
    hashed_password = Column(String(100), nullable=False)
    is_admin = Column(BOOLEAN, default=False)
    is_active = Column(BOOLEAN, default=True)
    created = Column(DateTime, default=datetime.now)
    modified = Column(DateTime, default=datetime.now, 
onpudate=datetime.datetime.now)
    roles = relationship('Role', secondary=users_roles, 
back_populates='users', cascade="all, delete-orphan")
    permissions = relationship('Permission', secondary=users_permissions, 
back_populates='users',
                               cascade="all, delete-orphan")

    def __repr__(self):
        return "<User(name='%s', email='%s', hashed_password='%s')>" % 
(self.name, self.email, self.hashed_password)


class Role(DeclarativeBase):
    __tablename__ = 'roles'

    id = Column(BigInteger, primary_key=True)
    name = Column(String(100), unique=True, nullable=False)
    users = relationship('User', secondary=users_roles, 
back_populates='roles',cascade="all, delete-orphan")
    permissions = relationship('Permission', secondary=roles_permissions, 
back_populates='roles',
                               cascade="all, delete-orphan")

    def __repr__(self):
        return "<Role(name='%s')>" % self.name


class Permission(DeclarativeBase):
    __tablename__ = 'permissions'

    id = Column(BigInteger, primary_key=True)
    name = Column(String(100), unique=True, nullable=False)
    description = Column(String(255))
    users = relationship('User', secondary=users_permissions, 
back_populates='permissions',
                         cascade="all, delete-orphan")
    roles = relationship('Role', secondary=roles_permissions, 
back_populates='permissions',
                         cascade="all, delete-orphan")

    def __repr__(self):
        return "<Permission(name='%s', description='%s')>" % (self.name, 
self.description)
</code>
However, Alembic is not generating the correct upgrade, i try to make it
<code>

def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    # op.drop_table('users')
    # ### end Alembic commands ###

    op.create_table('roles',
                    sa.Column('id', sa.BIGINT(), autoincrement=True, 
nullable=False),
                    sa.Column('name', sa.String(100), autoincrement=False, 
nullable=False),
                    sa.Column('users', BigInteger),
                    sa.Column('permissions', BigInteger),
                    sa.PrimaryKeyConstraint('id'),
                    sa.UniqueConstraint('name', name='roles_name_key')
                    # sa.ForeignKeyConstraint(['users'], 
['users_roles.users_id'], ondelete='CASCADE'),
                    # sa.ForeignKeyConstraint(['permissions'], 
['roles_permissions.permissions_id'], ondelete='CASCADE')
                    )
    op.create_table('permissions',
                    sa.Column('id', sa.BIGINT(), autoincrement=True, 
nullable=False),
                    sa.Column('name', sa.String(100), autoincrement=False, 
nullable=False),
                    sa.Column('description', sa.String(255)),
                    sa.Column('users', BigInteger),
                    sa.Column('roles', BigInteger),
                    sa.PrimaryKeyConstraint('id')
                    # sa.ForeignKeyConstraint(['users'], 
['users_permissions.users_id'], ondelete='CASCADE'),
                    # sa.ForeignKeyConstraint(['roles'], 
['role_permissions.roles_id'], ondelete='CASCADE')
                    )
    op.create_table('users_roles',
                    sa.Column('users_id', BigInteger, 
sa.ForeignKey('users.id'), primary_key=True),
                    sa.Column('roles_id', BigInteger, 
sa.ForeignKey('roles.id'), primary_key=True)
                    )
    op.create_table('users_permissions',
                    sa.Column('users_id', BigInteger, 
sa.ForeignKey('users.id'), primary_key=True),
                    sa.Column('permissions_id', BigInteger, 
sa.ForeignKey('permissions.id'), primary_key=True)
                    )
    op.create_table('roles_permissions',
                    sa.Column('roles_id', BigInteger, 
sa.ForeignKey('roles.id'), primary_key=True),
                    sa.Column('permissions_id', BigInteger, 
sa.ForeignKey('permissions.id'), primary_key=True)
                    )
    op.drop_constraint('users_name_key', 'users')
    op.add_column('users', sa.Column('is_admin', sa.BOOLEAN, 
autoincrement=False, nullable=False, default=False))
    op.add_column('users', sa.Column('is_active', sa.BOOLEAN, 
autoincrement=False, nullable=False, default=True))
    op.add_column('users', sa.Column('created', sa.DateTime, 
autoincrement=False, nullable=False,
                                     default=datetime.datetime.now))
    op.add_column('users', sa.Column('modified', sa.DateTime, 
autoincrement=False, nullable=False,
                                     default=datetime.datetime.now))
    op.add_column('users', sa.Column('roles', BigInteger))
    op.add_column('users', sa.Column('permissions', BigInteger))

    op.create_foreign_key(constraint_name="users_roles_fk", 
source_table="users", referent_table="users_roles",
                          local_cols=["roles"], remote_cols=["roles_id"], 
ondelete='CASCADE')
    op.create_foreign_key("users_permissions_fk", "users", 
"users_permissions", ["permissions"], ["permissions_id"],
                          ondelete='CASCADE')
    op.create_foreign_key("permissions_users_fk", "permissions", 
"users_permissions", ["users"], ["users_id"],
                          ondelete='CASCADE')
    op.create_foreign_key("permissions_roles_fk", "permissions", 
"roles_permissions", ["roles"], ["roles_id"],
                          ondelete='CASCADE')
    op.create_foreign_key("roles_users_fk", "roles", "users_roles", 
["users"], ["users_id"],
                          ondelete='CASCADE')
    op.create_foreign_key("roles_permissions_fk", "roles", 
"roles_permissions", ["permissions"], ["permissions_id"],
                          ondelete='CASCADE')
</code>
i have an error, primary key for users_roles is a composite keys and i dont 
know how declare it, how make that
<code>
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) there is no 
unique constraint matching given keys for referenced table "users_roles"
 [SQL: 'ALTER TABLE users ADD CONSTRAINT users_roles_fk FOREIGN KEY(roles) 
REFERENCES users_roles (roles_id) ON DELETE CASCADE'] (Background on this 
error at: http://sqlalche.me/e/f405)
</code>

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy-alembic" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy-alembic+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to