【发布时间】: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