python - tutorial - sqlalchemy: la inserción masiva del alambique falla: el objeto ''str'' no tiene ningún atributo ''_autoincrement_column''
sqlalchemy tutorial español (1)
Mi modelo se ve como
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)
donde GUID es sqlalchemy personalizado tipo I crea la tabla usando 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'')
)
y tabla PostgreSQL como
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)
Intento ejecutar la revisión y actualizar el db como
def upgrade():
op.bulk_insert(''categories'',
[
{''name'': ''first'', ''parent'': ''first_parent''},
{''name'': ''second'', ''parent'': ''second_parent''}
]
)
cuando ejecuto la alembic upgrade head
, veo error como
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''
¿Qué es lo que estoy haciendo mal aquí?
todo lo que tuve que hacer es crear una table
antes de bulk_insert, incluso si tengo un esquema explícito en models.py
separados
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''}
]
)
y luego pude ejecutar el alembic upgrade head
sin problemas y los datos se serializaron con éxito en la base de datos.