13

我的模型看起来像

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 upgrade head,我看到错误为

  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'

我在这里做错了什么?

4

1 回答 1

17

我所要做的就是创建一个table之前的 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 upgrade head毫无问题地运行,并且数据在数据库中成功序列化。

于 2013-04-02T16:20:36.380 回答