数据库
首页 > 数据库> > python – sqlalchemy:alembic批量插入失败:’str’对象没有属性’_autoincrement_column’

python – sqlalchemy:alembic批量插入失败:’str’对象没有属性’_autoincrement_column’

作者:互联网

我的模型看起来像

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 '<Category:%s:%s:%s>' % (
            self.uuid, self.name, self.category_type)

其中GUID是自定义sqlalchemy类型
我使用alembic –autogenerate选项创建表

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

和PostgreSQL表一样

            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)

我尝试运行修订并将数据库更新为

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

当我运行alembic升级头时,我看到错误为

  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 "<string>", 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'

我在这做错了什么?

解决方法:

我所要做的就是在bulk_insert之前创建一个表,即使我在单独的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'}
                   ]
    )

然后我能够运行alembic升级头没有任何问题,数据在数据库中成功序列化.

标签:python,postgresql,sqlalchemy,alembic
来源: https://codeday.me/bug/20191002/1840680.html