mod_wsgi 下的 flask-sqlalchemy "no such table"
flask-sqlalchemy "no such table" under mod_wsgi
出于某种原因,当在 apache + mod_wsgi.
下 运行ning 时,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 下工作吗?
好的 - 明白了。在这里留下答案以防其他人被这个咬伤。事实证明,较新的基于 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.create_all()
仅创建 /tmp/zop.sqlite3
而不是 /tmp/systemd-private-M4Xj0e/tmp/zop.sqlite3
。 Apache 正在抛出错误,因为它找不到数据库。
使用替代的非 tmp 数据库位置(例如 /var/www/zop.sqlite3
)或设置 PrivateTmp=false
修复此问题
出于某种原因,当在 apache + mod_wsgi.
下 运行ning 时,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 下工作吗?
好的 - 明白了。在这里留下答案以防其他人被这个咬伤。事实证明,较新的基于 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.create_all()
仅创建 /tmp/zop.sqlite3
而不是 /tmp/systemd-private-M4Xj0e/tmp/zop.sqlite3
。 Apache 正在抛出错误,因为它找不到数据库。
使用替代的非 tmp 数据库位置(例如 /var/www/zop.sqlite3
)或设置 PrivateTmp=false
修复此问题