由于某些原因,flask-sqlalchemy在以Apache + mod_wsgi运行时似乎无法解决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下工作吗?
好的-知道了。万一有人被这咬伤,就把答案留在这里。事实证明,在较新的基于redhat的系统(特别是使用systemd的系统)上的Apache使用私有的/ tmp。
这在 /usr/lib/systemd/system/httpd.service
[Service]
PrivateTmp=true
因此,我的数据库位于/tmp/systemd-private-M4Xj0e/tmp/zop.sqlite3
而不是中/tmp/zop.sqlite3
。而且,私有tmp目录中的该DB从未正确初始化-运行db.create_all()
只是创建/tmp/zop.sqlite3
而不是创建/tmp/systemd-private-M4Xj0e/tmp/zop.sqlite3
。Apache之所以抛出错误是因为它找不到数据库。
使用备用的非tmp数据库位置(例如/var/www/zop.sqlite3
)或设置PrivateTmp=false
可解决此问题
此处更多信息:http : //blog.oddbit.com/2012/11/05/fedora-private-tmp/
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句