【问题标题】:flask-sqlalchemy "no such table" under mod_wsgimod_wsgi下的flask-sqlalchemy“没有这样的表”
【发布时间】:2015-09-26 05:53:49
【问题描述】:

由于某种原因,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 下工作吗?

【问题讨论】:

  • 您是否使用db.create_all() 创建了表?
  • 你检查过sqlite db文件的权限吗?如果 Apache 没有创建它,请确保 Apache 有权读取它。
  • 是 - 使用 db.create_all() 创建的表 [注意 python myapp.py 有效]
  • 还将 sqlite 文件的权限更改为 777 - 无济于事。

标签: python sqlite flask sqlalchemy mod-wsgi


【解决方案1】:

好的 - 想通了。在这里留下答案,以防其他人被此咬伤。事实证明,较新的基于 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/

【讨论】:

    猜你喜欢
    • 2013-06-30
    • 2015-07-30
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    相关资源
    最近更新 更多