Thank you very much. it's very helpful to me.
在 2014年3月14日星期五UTC+8下午11时23分07秒,Michael Bayer写道: > > > On Mar 14, 2014, at 1:28 AM, Yunlong Mao <thr...@gmail.com <javascript:>> > wrote: > > Hi all, > > I have some problem with sqlalchemy and mysql. > > """ > class User(db.Model, UserMixin): > __tablename__ = 'user' > > id = Column(Integer, autoincrement=True, nullable=False, unique=True, > index=True) > coreid = Column(String(32), primary_key=True) > """ > u_r_association = Table('user_role', db.metadata, > Column('id', Integer, primary_key=True), > Column('user_id', Integer, ForeignKey('user.id'), nullable=False), > Column('role_id', Integer, ForeignKey('role.id'), nullable=False) > ) > I create model and association table like this, my problems: > > 1. the autoincrement is invalid, i can't find it after create sql by > sqlachemy. > > > this is because it is configured incorrectly; the auto increment column > must be a primary key column. this is not just SQLAlchemy’s behavior > but is also a limitation of MySQL. Note the following exception is > returned by the database directly: > > CREATE TABLE user ( > id INTEGER NOT NULL AUTO_INCREMENT, > coreid VARCHAR(32) NOT NULL, > PRIMARY KEY (coreid) > ) > > > File "build/bdist.macosx-10.4-x86_64/egg/MySQLdb/connections.py", line > 36, in defaulterrorhandler > sqlalchemy.exc.OperationalError: (OperationalError) (1075, 'Incorrect > table definition; there can be only one auto column and it must be defined > as a key') '\nCREATE TABLE user (\n\tid INTEGER NOT NULL AUTO_INCREMENT, > \n\tcoreid VARCHAR(32) NOT NULL, \n\tPRIMARY KEY (coreid)\n)\n\n' () > > see http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html. > > The attached script illustrates how to hack SQLAlchemy to render DDL like > the above however it isn’t accepted by the database. > > 2. how can i set the autoincrement with a initialize value. > > > use ALTER TABLE: > > > http://stackoverflow.com/questions/970597/change-auto-increment-starting-number > > SQLAlchemy provides the DDL construct: > http://docs.sqlalchemy.org/en/rel_0_9/core/ddl.html?#sqlalchemy.schema.DDL > > e.g. > > from sqlalchemy import event, DDL > > event.listen(User.__table__, "after_create", DDL("ALTER TABLE user > AUTO_INCREMENT = 5")) > > > 3. how can i not generate the real foreignkey in databases, only leave it > in model config. > > > I don’t know why you’d need this as if you just use MyISAM in MySQL, > foreign keys are ignored in any case, and you don’t need ForeignKey anyway > unless you are looking for joins to generate themselves (which could be > handy). > > Again, the DDL support allows this: > http://docs.sqlalchemy.org/en/rel_0_9/core/ddl.html?highlight=createcolumn#controlling-ddl-sequences > > from sqlalchemy.schema import AddConstraint, ForeignKeyConstraint > > for table in Base.metadata.tables.values(): > for constraint in table.constraints: > if isinstance(constraint, ForeignKeyConstraint): > AddConstraint(constraint).execute_if(callable_ = lambda *args: > False) > > > the attached script demonstrates all three techniques (but fails unless > you disable the AUTO_INCREMENT hack). > > > -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at http://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.