Doing the ignore in the include_object did the trick.  That is exactly what 
I needed.  Thanks!

On Friday, December 23, 2016 at 3:36:10 PM UTC-8, mike bayer wrote:
>
> MyISAM does not actually record foreign key definitions.   Autogenerate 
> is not compatible with foreign keys that are declared in the model yet 
> are not actually present in the database due to MyISAM.   To keep these 
> FK definitions in Python but work around the autogenerate issue, create 
> an include_object rule that skips foreign_key_constraint detection: 
>
>
> http://alembic.zzzcomputing.com/en/latest/api/runtime.html?highlight=include_object#alembic.runtime.environment.EnvironmentContext.configure.params.include_object
>  
>
> On 12/22/2016 06:08 PM, Adam Patt wrote: 
> > I'm using mysql 5.1.73 and alembic 0.8.6 and even when the model has not 
> > changed.  Below I have the schema migration which is getting auto 
> > generated as well as the models defs. This is using MyISAM and when I 
> > look at the Foreign Keys tab in MySQL Workbench, it says foreign keys 
> > can only be used in certain engines. I only recently added the Foreign 
> > Key and migrations worked exactly as expected before this change. 
> > 
> > What am I doing wrong? 
> > 
> > ### generated schema migration 
> > 
> > def upgrade(): 
> >     ### commands auto generated by Alembic - please adjust! ### 
> >     op.drop_index('fk_command_task_id_task', table_name='command') 
> >     op.create_foreign_key(op.f('fk_command_task_id_task'), 'command', 
> > 'task', ['task_id'], ['id']) 
> >     op.drop_index('fk_task_job_id_job', table_name='task') 
> >     op.create_foreign_key(op.f('fk_task_job_id_job'), 'task', 'job', 
> > ['job_id'], ['id']) 
> >     ### end Alembic commands ### 
> > 
> > 
> > def downgrade(): 
> >     ### commands auto generated by Alembic - please adjust! ### 
> >     op.drop_constraint(op.f('fk_task_job_id_job'), 'task', 
> > type_='foreignkey') 
> >     op.create_index('fk_task_job_id_job', 'task', ['job_id'], 
> unique=False) 
> >     op.drop_constraint(op.f('fk_command_task_id_task'), 'command', 
> > type_='foreignkey') 
> >     op.create_index('fk_command_task_id_task', 'command', ['task_id'], 
> > unique=False) 
> >     ### end Alembic commands ### 
> > 
> > ### object definitions 
> > 
> > Base = declarative_base() 
> > 
> > # make it so constraints have a name so that backward migrations work 
> > correctly 
> > Base.metadata = MetaData(naming_convention={ 
> >         "ix": 'ix_%(column_0_label)s', 
> >         "uq": "uq_%(table_name)s_%(column_0_name)s", 
> >         "ck": "ck_%(table_name)s_%(constraint_name)s", 
> >         "fk": 
> "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", 
> >         "pk": "pk_%(table_name)s" 
> >       }) 
> > 
> > 
> > class SnapBase(object): 
> >     """ 
> >     base for all SNAP sqlalchemy objects 
> >     does the following things: 
> >         - adds a default id field to all objects 
> >         - automatically generate a table name based on the class name. 
> >  Turns ClassName to class_name 
> >         - creates a nice human readable version of any object 
> >         - utility method to get the list of fields available 
> >     """ 
> >     @declared_attr 
> >     def __tablename__(cls): 
> >         """ 
> >         turn things like MyTable into my_table in the database 
> >         """ 
> >         tablename = '' 
> >         for c in cls.__name__: 
> >             if c.isupper() and tablename: 
> >                 tablename += '_' 
> >             tablename += c.lower() 
> >         return tablename 
> > 
> >     def _field_names(self): 
> >         return [str(c).split('.')[1] for c in self.__table__.columns] 
> > 
> >     def __repr__(self): 
> >         display = "" 
> >         for column in self.__table__.columns: 
> >             name = str(column).split('.')[1] 
> >             if display: 
> >                 display += ', ' 
> >             value = getattr(self, name) 
> >             column_type = str(column.type) 
> >             if (column_type.startswith('VARCHAR') or 
> > column_type.startswith('CHAR') or column_type in ['DATETIME', 'DATE']) 
> > and value is not None: 
> >                 val = "%s='%s'" 
> >             else: 
> >                 val = "%s=%s" 
> >             display += val % (name, value) 
> >         return '%s(%s)' % (self.__class__.__name__, display) 
> > 
> >     id = Column(Integer, primary_key=True) 
> > 
> > 
> > class Job(SnapBase, Base): 
> >     user = Column(String(50), nullable=False) 
> >     status = Column(String(10), default='running', nullable=False)  # 
> > running/complete 
> >     created = Column(DateTime, default=datetime.datetime.utcnow, 
> > nullable=False) 
> >     updated = Column(DateTime, default=datetime.datetime.utcnow, 
> > onupdate=datetime.datetime.utcnow, nullable=False) 
> > 
> >     tasks = relationship('Task', backref='job') 
> > 
> > 
> > class Task(SnapBase, Base): 
> >     serial = Column(String(50), nullable=False) 
> >     name = Column(String(50), nullable=False) 
> >     user = Column(String(50), nullable=False) 
> >     status = Column(String(10), default='running', nullable=False)  # 
> > running/complete 
> >     result = Column(String(50)) 
> >     message = Column(Text) 
> >     created = Column(DateTime, default=datetime.datetime.utcnow, 
> > nullable=False) 
> >     updated = Column(DateTime, default=datetime.datetime.utcnow, 
> > onupdate=datetime.datetime.utcnow, nullable=False) 
> > 
> >     job_id = Column(Integer, ForeignKey('job.id')) 
> >     commands = relationship('Command', backref='task') 
> > 
> > class Command(SnapBase, Base): 
> >     serial = Column(String(50), nullable=False) 
> >     agent = Column(String(20), nullable=False)  # snap/oob/cobbler/chef 
> >     silo = Column(String(20), nullable=False) 
> >     command = Column(String(30), nullable=False) 
> >     delay = Column(Integer, default=0, nullable=False) 
> >     retries = Column(Integer, default=0, nullable=False) 
> >     timeout = Column(Integer, nullable=False) 
> >     expire = Column(DateTime, nullable=False) 
> >     parameters = Column(JSONEncodedDict(2000), default={}, 
> > nullable=False)  # json 
> >     status = Column(String(10), default='pending', nullable=False)  # 
> > pending, sent, success/error 
> >     result = Column(String(50)) 
> >     message = Column(Text) 
> >     user = Column(String(50), nullable=False) 
> >     depends_on = Column(Integer) 
> >     created = Column(DateTime, default=datetime.datetime.utcnow, 
> > nullable=False) 
> >     updated = Column(DateTime, default=datetime.datetime.utcnow, 
> > onupdate=datetime.datetime.utcnow, nullable=False) 
> > 
> >     task_id = Column(Integer, ForeignKey('task.id')) 
> > 
> > -- 
> > 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 
> <javascript:> 
> > <mailto:sqlalchemy-alembic+unsubscr...@googlegroups.com <javascript:>>. 
> > 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