sqlalchemy: alembic bulk insert fails: 'str' object has no attribute '_autoincrement_column'

匿名 (未验证) 提交于 2019-12-03 02:03:01

问题:

My model looks like

class Category(UserMixin, db.Model):     __tablename__ = 'categories'     uuid = Column('uuid', GUID(), default=uuid.uuid4, primary_key=True,                   unique=True)     name = Column('name', String, nullable=False)     parent = Column('parent', String, nullable=False)     created_on = Column('created_on', sa.types.DateTime(timezone=True),                         default=datetime.utcnow())     __table_args__ = (UniqueConstraint('name', 'parent'),)      def __init__(self, name, parent):         self.name = name         self.parent = parent      def __repr__(self):         return '' % (             self.uuid, self.name, self.category_type) 

where GUID is custom sqlalchemy type I create the table using alembic --autogenerate option

 op.create_table('categories',                     sa.Column('uuid', UUID(), nullable=False),                     sa.Column('name', sa.String(), nullable=False),                     sa.Column('parent', sa.String(), nullable=False),                     sa.Column('created_on', sa.DateTime(timezone=True),                               nullable=True),                     sa.PrimaryKeyConstraint('uuid'),                     sa.UniqueConstraint('name', 'parent'),                     sa.UniqueConstraint('uuid')     ) 

and PostgreSQL table as

            Table "public.categories"    Column   |           Type           | Modifiers ------------+--------------------------+-----------  uuid       | uuid                     | not null  name       | character varying        | not null  parent     | character varying        | not null  created_on | timestamp with time zone | Indexes:     "categories_pkey" PRIMARY KEY, btree (uuid)     "categories_name_parent_key" UNIQUE CONSTRAINT, btree (name, parent) 

I try to run the revision and update the db as

def upgrade():     op.bulk_insert('categories',                    [                        {'name': 'first', 'parent': 'first_parent'},                        {'name': 'second', 'parent': 'second_parent'}                    ]     ) 

when I run alembic upgrade head, I see error as

  File "/Users/me/.virtualenvs/envs/project/lib/python2.7/site-packages/alembic/environment.py", line 494, in run_migrations     self.get_context().run_migrations(**kw)   File "/Users/me/.virtualenvs/envs/project/lib/python2.7/site-packages/alembic/migration.py", line 211, in run_migrations     change(**kw)   File "alembic/versions/491d4f91e0bc_generate_categories_.py", line 21, in upgrade     {'name': 'second', 'parent': 'second_parent'}   File "", line 7, in bulk_insert   File "/Users/me/.virtualenvs/envs/project/lib/python2.7/site-packages/alembic/operations.py", line 710, in bulk_insert     self.impl.bulk_insert(table, rows)   File "/Users/me/.virtualenvs/envs/project/lib/python2.7/site-packages/alembic/ddl/impl.py", line 179, in bulk_insert     table._autoincrement_column = None AttributeError: 'str' object has no attribute '_autoincrement_column' 

What is that I am doing wrong here?

回答1:

all I had to do is to create a table before bulk_insert, even if I have a explicit schema in separate models.py

import sqlalchemy as sa from sqlalchemy.sql import table from alembic import op  def upgrade():      categories = table('categories',                        sa.Column('uuid', UUID(),                               primary_key=True,                               unique=True, autoincrement=False),                        sa.Column('name', String),                        sa.Column('parent', String),                        sa.Column('created_on', sa.types.DateTime(timezone=True),                               default=datetime.utcnow())     )     op.bulk_insert(categories,                    [                        {'name': 'first', 'parent': 'first_parent'},                        {'name': 'second', 'parent': 'second_parent'}                    ]     ) 

and then I was able to to run alembic upgrade head without any issues and data was serialized successfully in database.



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!