【问题标题】:Flask & SqlAlchemy - alembic session.add_all() results in AttributeError: 'bool' object has no attribute 'clear' errorFlask & SqlAlchemy - alembic session.add_all() 导致 AttributeError: 'bool' object has no attribute 'clear' 错误
【发布时间】:2014-09-07 08:50:57
【问题描述】:

我正在尝试插入一些数据作为部署的一部分。我创建了以下 Alembic 修订脚本

revision = '59891ffc8502'
down_revision = '349540cf9cef'

from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import mysql
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship

Session = sessionmaker()
Base = declarative_base()

class Colours(Base):
    __tablename__ = 'colours'

    id = sa.Column(sa.Integer, primary_key=True)
    name = sa.Column('name', sa.Unicode(length=25), nullable=False)
    code = sa.Column('code', sa.Unicode(length=2), nullable=False)


def upgrade():
    bind = op.get_bind()
    session = Session(bind=bind)
    session._model_changes = False

    op.alter_column('colours', 'code', new_column_name='code', existing_type=mysql.VARCHAR(length=25))

    col = [ 
            { "name": "Black", "code": "ff00cc" }, 
            { "name": "Blue", "code": "ff00cc" }, 
            { "name": "Brown", "code": "ff00cc" }, 
            { "name": "Gold", "code": "ff00cc" }, 
            { "name": "Green", "code": "ff00cc" }
    ]

    # populate colours table
    colours = { c['name']: Colours(name=unicode(c['name']), code=c['code']) for c in col}
    session.add_all(colours.values())

    session.commit()
    # ### end Alembic commands ###

升级头导致 AttributeError: 'bool' object has no attribute 'clear' 错误。 有什么线索吗?

【问题讨论】:

  • 你以前有吗?

标签: python flask sqlalchemy flask-sqlalchemy alembic


【解决方案1】:

事实证明,设置 session._model_changes = False 并没有足够照顾 Flask-SQLAlchemy。您需要完全注销它注册的事件处理程序。

from flask_sqlalchemy import _SessionSignalEvents
from sqlalchemy import event
from sqlalchemy.orm import Session as BaseSession

Session = sessionmaker()

event.remove(BaseSession, 'before_commit', _SessionSignalEvents.session_signal_before_commit)
event.remove(BaseSession, 'after_commit', _SessionSignalEvents.session_signal_after_commit)
event.remove(BaseSession, 'after_rollback', _SessionSignalEvents.session_signal_after_rollback)

【讨论】:

    猜你喜欢
    • 2021-04-10
    • 2014-12-20
    • 1970-01-01
    • 2020-06-17
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多