Python SQLAlchemy InvalidRequestError:无法定位仅在gunicorn上发生的名称
好的,我有以下几点。在Python SQLAlchemy InvalidRequestError:无法定位仅在gunicorn上发生的名称,python,heroku,flask,sqlalchemy,gunicorn,Python,Heroku,Flask,Sqlalchemy,Gunicorn,好的,我有以下几点。在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.Strin
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")
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")
在部门/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")
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")
在本地使用flask开发服务器完全可以。但是,一旦我部署到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:初始化映射程序时
映射器|用户|用户,表达式“用户|部门|关系|表”
找不到名称(“名称”“用户\部门\关系\表”为
未定义”)。如果这是类名,请考虑添加
之后的类的关系()
两个依赖类都已定义
我想知道是否有更好的方法来组织这些部分以避免明显的错误,但我更好奇的是,为什么这个组织在开发服务器上运行得很好,但在gunicorn/heroku上却爆发了一些激烈的事件。我无法解释heroku和开发服务器之间的差异,但是我把部门模式从
users = relationship("Department",secondary="user_department_relationship_table", back_populates="users")
到
这将自动设置用户模型,这反过来意味着我可以删除关于部门和关系表的任何提及
“”\_(ツ)_/“您是否有两个数据库,一个在heroku上,一个在local上?它似乎在抱怨您的生产环境中不存在该表。@ChrisHawkes这似乎是在应用程序尝试与数据库通信之前发生的。但是,有一个alembic迁移来添加我在这两个环境中都没有问题地运行的user\u department\u relationship\u表。S在我的例子中,测试环境不会出错,这使得在产品部署之前很难了解它