2015-09-26 51 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/

相關問題