flask-sqlalchemy"没有这样的表"在mod_wsgi下

时间:2015-09-26 05:53:49

标签: python sqlite flask sqlalchemy mod-wsgi

由于某些原因,在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下运行吗?

1 个答案:

答案 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修复此

更多信息:http://blog.oddbit.com/2012/11/05/fedora-private-tmp/