【问题标题】:KeyError: *really large number* when running db.session.add on Flask with SQLAlchemyKeyError: *really large number* when running db.session.add on Flask with SQLAlchemy
【发布时间】:2017-07-14 03:23:52
【问题描述】:

我有一个用户类:

class User(db.Model, UserMixin):
    """
    ORM Class: An object that represents a user
    """
    __tablename__ = "Users"
    id              = db.Column('id',           db.Integer,             primary_key=True)
    email           = db.Column('email',        db.String(128),         unique=True)
    passwordhash    = db.Column('passwordhash', db.String(128))

def __init__(self, email, password):
    self.email = email
    self.passwordhash = generate_password_hash(password)

    logging.info("creating user with email and pw:" + email + " " + password)

当我创建一个新用户时:

newuser = User(email="test@email.com", password="hunter2")
db.session.add(newuser)

我得到一个 KeyError:140736669950912

  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/_collections.py", line 988, in __call__
    return self.registry[key]
KeyError: 140736669950912

这个数字是从哪里来的?在处理 RuntimeError: application not registered on db instance and no applicationbound to current context

的 KeyError 时,我还遇到了另一个错误

【问题讨论】:

  • 请您添加完整的堆栈跟踪。
  • 当我尝试在控制台中运行 Person.query.all() 或任何其他选择查询时会发生这种情况。

标签: python flask sqlalchemy flask-sqlalchemy


【解决方案1】:

按照他们的current documentation 中的建议, 与其手动创建SqlAlchemy() 的实例并将其保存到db,不如尝试从sqlalchemy.ext.declarative.Base 继承,如下所示:

from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine(DATABASE_URI, echo=False)
db_session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine))

Base = declarative_base()
Base.query = db_session.query_property()


# the following should be moved to your models.py

from sqlalchemy import Column, Integer, String

class User(Base):
    """ORM Class: An object that represents a user
    """
    __tablename__ = "Users"

    id = Column(Integer)
    email = Column(String(128), primary_key=True)
    passwordhash = Column(String(128), unique=True)

【讨论】:

  • 您好,您知道手动创建 SqlAlchemy() 实例有什么问题吗?这是许多 SQLAlchemy+Flask 教程使用的方法,因此我遵循相同的方法,但最终得到 KeyError。
  • @shiouming 我记得它与未正确设置应用程序上下文有关。见stackoverflow.com/questions/19437883/…
【解决方案2】:

检查您的迁移是否是最新的也可能会有所帮助。当我遇到这个问题时,在我删除现有的并重新运行迁移后它得到了修复:

python manage.py db migrate
python manage.py db ugrade

【讨论】:

    猜你喜欢
    • 2021-12-05
    • 2020-05-24
    • 2016-03-02
    • 2022-12-28
    • 2020-08-18
    • 1970-01-01
    • 2015-08-05
    • 2021-06-29
    • 2020-09-07
    相关资源
    最近更新 更多