On Wed, Dec 12, 2018 at 1:01 PM patrick payet <papa...@gmail.com> wrote:
>
> 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

it's not clear here if you're saying alembic is adding foreign keys
where they dont belong during autogenerate, or if you dont know why
you are getting the error you are getting.  The error is because you
don't need FOREIGN KEY constraints on roles, permissions, or users -
the FOREIGN KEY is only on the many-to-many tables, in this case
users_roles, users_permissions, roles_permissions.

otherwise if you can illustrate the exact CREATE TABLE statements
you'd like to see, I can illustrate a correct model for that which
Alembic will generate.



> <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.

-- 
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