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

标签 python postgresql sqlalchemy alembic

我的模型看起来像

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'

我这里做错了什么?

最佳答案

我所要做的就是在 bulk_insert 之前创建一个 table,即使我在单独的 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 并且数据在数据库中成功序列化。

关于python - sqlalchemy:alembic 批量插入失败: 'str' 对象没有属性 '_autoincrement_column',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15725859/

相关文章:

python - 我应该经常使用 Django select_lated 和 prefetch_lated 吗?

python - Docstring 的前导空格不一致

java - 处理 Hibernate 的错误代码?

php - Adodb 使用 php 和 PostgreSQL

带有加密功能的Postgresql 42883错误代码

php - 如何创建自己的 GTFS 提要和旅行计划器?

python - 如何将数组从 python 传递到 shell 脚本并执行它?

python - Sqlalchemy 返回元组

python - 在枚举列表中过滤枚举 sqlalchemy

python - SQLAlchemy 是否支持 mysql 中的 RLIKE?