2015-09-26 95 views
1

由于某些原因,flask-sqlalchemy在apache + mod_wsgi下运行时似乎遇到了解决sqlite表问题的问题。在mod_wsgi下flask-sqlalchemy“no such table”

简化例如:

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

你创建'db.create_all表()'? – ahmed

+0

你检查了sqlite数据库文件的权限吗?如果Apache没有创建它,请确保Apache有权读取它。 –

+0

是的 - 用db.create_all()创建的表[请注意,python myapp.py工程] – shreddd

回答

1

好的 - 算出来了。在这里留下答案,以防其他人被此事咬伤。事实证明,Apache在更新的基于redhat的系统上(特别是使用systemd的系统)使用私有/ tmp。

/usr/lib/systemd/system/httpd.service

[Service] 
PrivateTmp=true 

因为这是规定,我的数据库是/tmp/systemd-private-M4Xj0e/tmp/zop.sqlite3而非/tmp/zop.sqlite3。并且这个私人tmp目录中的数据库从未正确初始化 - 运行db.create_all()仅创建/tmp/zop.sqlite3而不是/tmp/systemd-private-M4Xj0e/tmp/zop.sqlite3。 Apache因为找不到数据库而抛出错误。

使用备用非TMP DB位置(例如/var/www/zop.sqlite3)或设置PrivateTmp=false修复了这个

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

相关问题