由于某些原因,在apache + mod_wsgi下运行时,flask-sqlalchemy似乎在解析sqlite表时遇到问题。
简化示例:
from models import db, User
app = Flask(__name__)
app.config['DEBUG'] = True
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/zop.sqlite3'
db.init_app(app)
models.py:
from flask.ext.sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50), unique=True)
email = db.Column(db.String(120), unique=True)
...
当我通过python myapp.py
但是当我在apache + mod_wsgi下运行时,运行User.query.filter_by(name=username).first()
之类的内容时出现以下错误:
OperationalError: (sqlite3.OperationalError) no such table: user [SQL: u'SELECT user.id AS user_id, user.name AS user_name, user.email AS user_email \\nFROM user \\nWHERE user.name = ?\\n LIMIT ? OFFSET ?'] [parameters: ('foo', 1, 0)]
我需要更改以使其在apache + mod_wsgi下运行吗?
答案 0 :(得分:2)
好的 - 想通了。留下答案,以防其他人被此咬伤。事实证明,基于红帽的新系统(特别是使用systemd的系统)上的Apache使用私有/ tmp。
这在=NOMINAL(1.0248%,12)
/usr/lib/systemd/system/httpd.service
因此,我的数据库位于[Service]
PrivateTmp=true
而不是/tmp/systemd-private-M4Xj0e/tmp/zop.sqlite3
。私有tmp目录中的这个数据库从未正确初始化 - 运行/tmp/zop.sqlite3
只是创建db.create_all()
而不是/tmp/zop.sqlite3
。 Apache正在抛出错误,因为它无法找到数据库。
使用备用非tmp数据库位置(例如/tmp/systemd-private-M4Xj0e/tmp/zop.sqlite3
)或设置/var/www/zop.sqlite3
修复此