Hi all, I have a class called MediaChapter(Base), which I've refactored 
into MediaBase(Base) and MediaChapter(MediaBase) When I run the migration, 
I see:

psycopg2.IntegrityError: insert or update on table "mediachapter" violates 
foreign key constraint "fk_mediachapter_id_mediabase"
DETAIL:  Key (id)=(570) is not present in table "mediabase".



I'm not sure exactly what this means because I create a mediabase.id.

I did
ws-alembic -c kjvrvg/conf/development.ini -x packages=all revision --auto -m 
"MediaBase-MediaChapter subclassing"


-- SUCCESS

then
ws-alembic -c kjvrvg/conf/development.ini -x packages=all upgrade head 


-- FAILED


Here are my models, MediaBase:

class MediaBase(Base):
    #: The table in the database
    __tablename__ = "mediabase"

    #: Database primary key for the row (running counter)
    id = Column(Integer, autoincrement=True, primary_key=True)

    # table inheritance
    media_type = Column(String(32), nullable=False)

    #: Publicly exposed non-guessable
    uuid = Column(UUID(as_uuid=True), default=uuid4)

    localizedname = Column(Unicode(128), default=None)

    #: url
    url = Column(Unicode(384), default=None)

    # full iso language-locale identifier i.e. zh-Hans-US
    language_id = Column(String(16), default=None)

    # name of the person presenting the material
    presenter_name = Column(Unicode(64), default=None)
    source_material = Column(Unicode(128), default=None)

    # table inheritance
    __mapper_args__ = {'polymorphic_on': media_type}

    def __repr__(self):
        """Shell and debugger presentation."""
        return '{} ({}) {} <{}>'.format(self.localizedname, self.language_id
, str(self.uuid), self.url)

    def __str__(self):
        """Python default and admin UI string presentation."""
        return '{} ({}) presenter: {} source: {}  <{}>'.format(self.
localizedname, self.language_id, self.presenter_name, self.source_material, 
self.url)




and MediaChapter:

class MediaChapter(MediaBase):

    #: The table in the database
    __tablename__ = "mediachapter"

    __mapper_args__ = {'polymorphic_identity': 'chapter'}

    id = Column(Integer, ForeignKey('mediabase.id'), primary_key=True)

    #: Which chapter this media is part of
    chapter_id = Column(Integer, ForeignKey('chapter.id'))
    chapter = relationship("Chapter", back_populates="mediachapter")




and finally here is the auto-generated migration. I put all files in a 
github Gist.

https://gist.github.com/mazz/7d63e521316859f4ae852e5cea5d84eb



Any suggestions?
Mazz


"""MediaBase-MediaChapter subclassing

Revision ID: a00980918d75
Revises: e74ba4203098
Create Date: 2017-06-07 16:10:29.807437

"""

# revision identifiers, used by Alembic.
revision = 'a00980918d75'
down_revision = 'e74ba4203098'
branch_labels = None
depends_on = None

import datetime
import websauna.system.model.columns
from sqlalchemy.types import Text  # Needed from proper creation of JSON 
fields as Alembic inserts astext_type=Text() row

from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql

def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.create_table('mediabase',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('media_type', sa.String(length=32), nullable=False),
    sa.Column('uuid', postgresql.UUID(as_uuid=True), nullable=True),
    sa.Column('localizedname', sa.Unicode(length=128), nullable=True),
    sa.Column('url', sa.Unicode(length=384), nullable=True),
    sa.Column('language_id', sa.String(length=16), nullable=True),
    sa.Column('presenter_name', sa.Unicode(length=64), nullable=True),
    sa.Column('source_material', sa.Unicode(length=128), nullable=True),
    sa.PrimaryKeyConstraint('id', name=op.f('pk_mediabase'))
    )
    op.alter_column('group', 'created_at',
               existing_type=postgresql.TIMESTAMP(timezone=True),
               type_=websauna.system.model.columns.UTCDateTime(),
               existing_nullable=True)
    op.alter_column('group', 'updated_at',
               existing_type=postgresql.TIMESTAMP(timezone=True),
               type_=websauna.system.model.columns.UTCDateTime(),
               existing_nullable=True)
    op.create_foreign_key(op.f('fk_mediachapter_id_mediabase'), 
'mediachapter', 'mediabase', ['id'], ['id'])
    op.drop_column('mediachapter', 'source_material')
    op.drop_column('mediachapter', 'presenter_name')
    op.drop_column('mediachapter', 'localizedname')
    op.drop_column('mediachapter', 'url')
    op.drop_column('mediachapter', 'uuid')
    op.drop_column('mediachapter', 'language_id')
    op.alter_column('user_activation', 'created_at',
               existing_type=postgresql.TIMESTAMP(timezone=True),
               type_=websauna.system.model.columns.UTCDateTime(),
               existing_nullable=True)
    op.alter_column('user_activation', 'expires_at',
               existing_type=postgresql.TIMESTAMP(timezone=True),
               type_=websauna.system.model.columns.UTCDateTime(),
               existing_nullable=False)
    op.alter_column('user_activation', 'updated_at',
               existing_type=postgresql.TIMESTAMP(timezone=True),
               type_=websauna.system.model.columns.UTCDateTime(),
               existing_nullable=True)
    op.alter_column('users', 'activated_at',
               existing_type=postgresql.TIMESTAMP(timezone=True),
               type_=websauna.system.model.columns.UTCDateTime(),
               existing_nullable=True)
    op.alter_column('users', 'created_at',
               existing_type=postgresql.TIMESTAMP(timezone=True),
               type_=websauna.system.model.columns.UTCDateTime(),
               existing_nullable=True)
    op.alter_column('users', 'last_auth_sensitive_operation_at',
               existing_type=postgresql.TIMESTAMP(timezone=True),
               type_=websauna.system.model.columns.UTCDateTime(),
               existing_nullable=True)
    op.alter_column('users', 'last_login_at',
               existing_type=postgresql.TIMESTAMP(timezone=True),
               type_=websauna.system.model.columns.UTCDateTime(),
               existing_nullable=True)
    op.alter_column('users', 'updated_at',
               existing_type=postgresql.TIMESTAMP(timezone=True),
               type_=websauna.system.model.columns.UTCDateTime(),
               existing_nullable=True)
    # ### end Alembic commands ###


def downgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.alter_column('users', 'updated_at',
               existing_type=websauna.system.model.columns.UTCDateTime(),
               type_=postgresql.TIMESTAMP(timezone=True),
               existing_nullable=True)
    op.alter_column('users', 'last_login_at',
               existing_type=websauna.system.model.columns.UTCDateTime(),
               type_=postgresql.TIMESTAMP(timezone=True),
               existing_nullable=True)
    op.alter_column('users', 'last_auth_sensitive_operation_at',
               existing_type=websauna.system.model.columns.UTCDateTime(),
               type_=postgresql.TIMESTAMP(timezone=True),
               existing_nullable=True)
    op.alter_column('users', 'created_at',
               existing_type=websauna.system.model.columns.UTCDateTime(),
               type_=postgresql.TIMESTAMP(timezone=True),
               existing_nullable=True)
    op.alter_column('users', 'activated_at',
               existing_type=websauna.system.model.columns.UTCDateTime(),
               type_=postgresql.TIMESTAMP(timezone=True),
               existing_nullable=True)
    op.alter_column('user_activation', 'updated_at',
               existing_type=websauna.system.model.columns.UTCDateTime(),
               type_=postgresql.TIMESTAMP(timezone=True),
               existing_nullable=True)
    op.alter_column('user_activation', 'expires_at',
               existing_type=websauna.system.model.columns.UTCDateTime(),
               type_=postgresql.TIMESTAMP(timezone=True),
               existing_nullable=False)
    op.alter_column('user_activation', 'created_at',
               existing_type=websauna.system.model.columns.UTCDateTime(),
               type_=postgresql.TIMESTAMP(timezone=True),
               existing_nullable=True)
    op.add_column('mediachapter', sa.Column('language_id', sa.VARCHAR(length
=16), autoincrement=False, nullable=True))
    op.add_column('mediachapter', sa.Column('uuid', postgresql.UUID(), 
autoincrement=False, nullable=True))
    op.add_column('mediachapter', sa.Column('url', sa.VARCHAR(length=384), 
autoincrement=False, nullable=True))
    op.add_column('mediachapter', sa.Column('localizedname', sa.VARCHAR(
length=128), autoincrement=False, nullable=True))
    op.add_column('mediachapter', sa.Column('presenter_name', sa.VARCHAR(
length=64), autoincrement=False, nullable=True))
    op.add_column('mediachapter', sa.Column('source_material', sa.VARCHAR(
length=128), autoincrement=False, nullable=True))
    op.drop_constraint(op.f('fk_mediachapter_id_mediabase'), 'mediachapter', 
type_='foreignkey')
    op.alter_column('group', 'updated_at',
               existing_type=websauna.system.model.columns.UTCDateTime(),
               type_=postgresql.TIMESTAMP(timezone=True),
               existing_nullable=True)
    op.alter_column('group', 'created_at',
               existing_type=websauna.system.model.columns.UTCDateTime(),
               type_=postgresql.TIMESTAMP(timezone=True),
               existing_nullable=True)
    op.drop_table('mediabase')
    # ### end Alembic commands ###


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