【问题标题】:SQLAlchemy InvalidRequestError: failed to locate name happens only on gunicornSQLAlchemy InvalidRequestError: failed to locate name 仅发生在 gunicorn
【发布时间】:2016-05-04 22:07:00
【问题描述】:

好的,我有以下内容。在user/models.py:

class User(UserMixin, SurrogatePK, Model):
    __tablename__ = 'users'
    id = Column(db.Integer, primary_key=True, index=True)
    username = Column(db.String(80), unique=True, nullable=False)
    email = Column(db.String(80), unique=False, nullable=False)
    password = Column(db.String(128), nullable=True)
    departments = relationship("Department",secondary="user_department_relationship_table", back_populates="users")

department/models.py:

user_department_relationship_table=db.Table('user_department_relationship_table',
                             db.Column('department_id', db.Integer,db.ForeignKey('departments.id'), nullable=False),
                             db.Column('user_id',db.Integer,db.ForeignKey('users.id'),nullable=False),
                             db.PrimaryKeyConstraint('department_id', 'user_id') )


class Department(SurrogatePK, Model):
    __tablename__ = 'departments'
    id = Column(db.Integer, primary_key=True, index=True)
    name = Column(db.String(80), unique=True, nullable=False)
    short_name = Column(db.String(80), unique=True, nullable=False)
    users = relationship("User", secondary=user_department_relationship_table,back_populates="departments")

在本地使用烧瓶开发服务器完全可以正常工作。但是,一旦我部署到 heroku 上的标准 python buildpack,cpt/app.py 会加载两个模块以注册它们的蓝图:

from cpt import (
        public, user, department
        )

...


def register_blueprints(app):
    app.register_blueprint(public.views.blueprint)
    app.register_blueprint(user.views.blueprint)
    app.register_blueprint(department.views.blueprint)
    return None

并最终出现以下错误:

sqlalchemy.exc.InvalidRequestError:初始化映射器时 映射器|用户|用户,表达式'user_department_relationship_table' 找不到名称(“名称'user_department_relationship_table'是 未定义”)。如果这是一个类名,请考虑添加这个 与之后的类的关系() 两个依赖类都已定义。

我想知道是否有更好的方法来组织这些部分来明显避免这个错误,但我更好奇为什么这个组织在开发服务器上运行良好,但在 gunicorn/heroku 上炸毁了一些激烈的东西。

【问题讨论】:

  • 你有两个数据库,一个在heroku,一个在本地?似乎抱怨您的生产环境中不存在该表。
  • @ChrisHawkes 这似乎发生在应用程序尝试与数据库对话之前。但是,有一个 alembic 迁移来添加我在两种环境中都运行没有问题的 user_department_relationship_table。

标签: python heroku flask sqlalchemy gunicorn


【解决方案1】:

好吧,我无法解释 heroku 和开发服务器之间的差异,但我通过更改部门模式来解决错误

users = relationship("Department",secondary="user_department_relationship_table", back_populates="users")

users = relationship("User", secondary=user_department_relationship_table, backref="departments")

它会自动设置用户模型,这反过来意味着我可以删除任何提及的部门和关系表。

¯\_(ツ)_/¯

【讨论】:

  • 遇到同样的问题,在我的情况下,测试环境不会出错,这使得在产品部署之前很难了解它?
猜你喜欢
  • 1970-01-01
  • 2016-03-15
  • 2012-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-22
  • 2016-05-21
  • 2018-01-05
相关资源
最近更新 更多