Michael,

Thanks for the quick fix. 0.8.3 fixes the problem.

On Saturday, 17 October 2015 01:15:50 UTC+5:30, Michael Bayer wrote:
>
> this was kind of a big issue so that is fixed and in 0.8.3. today. 
>
>
>
> On 10/16/15 10:36 AM, Mike Bayer wrote: 
> > this is a bug, 
> > 
> https://bitbucket.org/zzzeek/alembic/issues/333/batch-fails-on-tables-that-have-indexes
>  
> > is added.  thanks for reporting! 
> > 
> > 
> > 
> > On 10/16/15 4:20 AM, Dheeraj Gupta wrote: 
> >> Hi, 
> >> 
> >> I have a single table in my sqlite database for which I am using 
> alembic 
> >> for migration. After the initial revision (creating table and columns), 
> >> I needed to modify the models so that some of the columns allowed NULL. 
> >> 
> >> My original models.py looks like: 
> >> 
> >> # models.py ###########################################33 
> >> from sqlalchemy import (BigInteger, 
> >>                         Column, 
> >>                         Integer, 
> >>                         SmallInteger, 
> >>                         String) 
> >> from sqlalchemy.ext.declarative import declarative_base 
> >> from sqlalchemy.schema import MetaData 
> >> 
> >> 
> >> convention = { 
> >>     "ix": 'ix_%(column_0_label)s', 
> >>     "uq": "uq_%(table_name)s_%(column_0_name)s", 
> >>     "fk": 
> "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", 
> >>     "pk": "pk_%(table_name)s" 
> >> } 
> >> 
> >> mymetadata = MetaData(naming_convention=convention) 
> >> Base = declarative_base(metadata=mymetadata) 
> >> 
> >> 
> >> class MyBase(Base): 
> >>     __abstract__ = True 
> >>     __table_args__ = {'mysql_charset': 'utf8', 'mysql_engine': 
> 'InnoDB', 
> >>                       'sqlite_autoincrement': 'True'} 
> >> 
> >> class TRequest(MyBase): 
> >>     __tablename__ = "trequests" 
> >>     id_ = Column("id", BigInteger().with_variant(Integer, "sqlite"), 
> >>                  primary_key=True) 
> >>     req_uuid = Column(String(32), unique=True, index=True, 
> nullable=False) 
> >>     ip1 = Column(String(15), nullable=True) 
> >>     ip2 = Column(String(15), nullable=True) 
> >>     port1 = Column(Integer, nullable=True) 
> >>     port2 = Column(Integer, nullable=True) 
> >>     proto = Column(String(3), nullable=True) 
> >>     tstamp = Column(Integer, nullable=True) 
> >>     win = Column(SmallInteger, nullable=False) 
> >>     status = Column(SmallInteger) 
> >>     status_changed = Column(Integer) 
> >>     accessed = Column(Integer) 
> >>     data_file = Column(String(255)) 
> >>     pcap_file = Column(String(255)) 
> >> 
> >> # End File############################################## 
> >> 
> >> req_uuid has a uniuq index which is named 'ix_trequests_req_uuid' per 
> >> the naming convention 
> >> 
> >> In my base revision script, the upgrade() function is: 
> >> def upgrade(): 
> >>     ### commands auto generated by Alembic - please adjust! ### 
> >>     op.create_table('trequests', 
> >>     sa.Column('id', sa.BigInteger().with_variant(sa.Integer, "sqlite"), 
> >>               nullable=False), 
> >>     sa.Column('req_uuid', sa.String(length=32), nullable=False), 
> >>     sa.Column('ip1', sa.String(length=15), nullable=False), 
> >>     sa.Column('ip2', sa.String(length=15), nullable=False), 
> >>     sa.Column('port1', sa.Integer(), nullable=False), 
> >>     sa.Column('port2', sa.Integer(), nullable=False), 
> >>     sa.Column('tstamp', sa.Integer(), nullable=False), 
> >>     sa.Column('proto', sa.String(length=3), nullable=False), 
> >>     sa.Column('win', sa.SmallInteger(), nullable=False), 
> >>     sa.Column('status', sa.SmallInteger(), nullable=True), 
> >>     sa.Column('accessed', sa.Integer(), nullable=True), 
> >>     sa.Column('status_changed', sa.Integer(), nullable=True), 
> >>     sa.Column('data_file', sa.String(length=15), nullable=True), 
> >>     sa.Column('pcap_file', sa.String(length=15), nullable=True), 
> >>     sa.PrimaryKeyConstraint('id', name=op.f('pk_trequests')), 
> >>     mysql_charset='utf8', 
> >>     mysql_engine='InnoDB', 
> >>     sqlite_autoincrement=True 
> >>     ) 
> >>     op.create_index(op.f('ix_trequests_req_uuid'), 'trequests', 
> >> ['req_uuid'], unique=True) 
> >> # End ########################### 
> >> 
> >> Now, I am adding a new revision to remove nullable=True from some 
> >> columns. The relevant upgrade function is 
> >> 
> >> 
> >> from net_transcript.db.models import convention as naming_convention 
> >> 
> >> def upgrade(): 
> >>     ### commands auto generated by Alembic - please adjust! ### 
> >>     with op.batch_alter_table('trequests', schema=None, 
> >>                               naming_convention=naming_convention) as 
> >> batch_op: 
> >>         batch_op.alter_column('port1', 
> >>                existing_type=sa.INTEGER(), 
> >>                nullable=True) 
> >>         batch_op.alter_column('port2', 
> >>                existing_type=sa.INTEGER(), 
> >>                nullable=True) 
> >>         batch_op.alter_column('proto', 
> >>                existing_type=sa.VARCHAR(length=3), 
> >>                nullable=True) 
> >>     ### end Alembic commands ### 
> >> 
> >> # End ####################################### 
> >> 
> >> However, on running the command I get an OperationalError 
> >> (sqlite3.OperationalError) index ix_trequests_req_uuid already exists 
> >> [SQL: u'CREATE UNIQUE INDEX ix_trequests_req_uuid ON 
> _alembic_batch_temp 
> >> (req_uuid)'] 
> >> 
> >> I looked at the source and in 
> >> 
> https://bitbucket.org/zzzeek/alembic/src/459549c9ab7fef91b2dc8986bc0643bb2f6ec0c8/alembic/operations/batch.py?at=master&fileviewer=file-view-default#batch.py-170
>  
> >> the Index is being defined by same name. I commented this code block 
> and 
> >> the migration succeeded without an error. 
> >> Is this a bug or am I doing something wrong? 
> >> 
> >> 
> >> Regards, 
> >> Dheeraj 
> >> 
>

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