【问题标题】:OperationalError no such table in Flask with SQLAlchemyOperationalError 在使用 SQLAlchemy 的 Flask 中没有这样的表
【发布时间】:2014-02-13 22:31:24
【问题描述】:

运行.py

if __name__ == '__main__':
    config() 
    app.run()

main.py

import database

app = Flask(__name__)

def config():
    app.config.from_object('config.DevConfig')

    # Run SQLAlchemy _that uses app.config_ and add entities if in DEBUG mode
    database.init_db(app)

    import blueprints.auth
    app.register_blueprint(blueprints.auth.auth)

数据库.py

db = None

def init_db(app):
    global db
    db = SQLAlchemy(app)

    from models import User, Interest, Event

    if app.config['DEBUG']:
        print 'Recreating all db'
        db.create_all() # I DO create everything
        print 'Loading test data'
        ... (here I add some Users and etc. and everything works fine - tests pass)

models.py

from database import db

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)
...

蓝图/auth.py

from models import User

auth = Blueprint('auth', __name__)

@auth.route('/')
def index():
    return str(User.query.get(1).interests)

所以我得到了

OperationalError: (OperationalError) no such table: user u'SELECT user.id AS user_id, user.username AS user_username, user.email AS user_email, user.passhash AS user_passhash, user.vk_page AS user_vk_page \nFROM user \nWHERE user.id = ?' (1,)

我做错了什么?

【问题讨论】:

  • user 真的最终在数据库中创建了吗?您是否检查过其他程序?
  • db.create_all() 仅在调试模式下执行。这是故意的吗?

标签: flask-sqlalchemy flask


【解决方案1】:

对于任何尝试使用内存数据库的人:

from sqlalchemy import create_engine
from sqlalchemy.pool import StaticPool

engine = create_engine(
    "sqlite://", 
    connect_args={"check_same_thread": False}, 
    poolclass=StaticPool
)

【讨论】:

  • 你就是那个男人。这是我认为拥有内存数据库的实际答案,而不仅仅是切换到文件。
  • 天哪,你就是那个人。 poolclass=StaticPool 改变了我。谢谢。
【解决方案2】:

为了让一切正常工作,我几乎没有什么需要改变的。

  1. 将配置中的DATABASE_URI 替换为SQLALCHEMY_DATABASE_URI 参数
  2. :memory: sqlite 地址替换为/tmp/test.db

现在可以正常使用了。

【讨论】:

  • +1000 ... 天哪,这令人沮丧。 db.create_all() 是 $@#&*^#* 与内存中的 sqlite ... 好的 ...
  • 对此行为的解释:gehrcke.de/2015/05/…
  • 我了解如何完成此答案的第一部分,但我不确定您所说的第二部分是什么意思。我假设:memory: 地址需要设置为等于SQLALCHEMY_DATABASE_URI,但我不知道该怎么做。我需要在config.py 文件中附加什么内容?
  • @sudosensei 它只是意味着,不要使用内存存储:) 如果你使用过:memory:before,不要。如果你没有,你很好。
  • 我的问题实际上完全不同。不过感谢您的快速回复!
猜你喜欢
  • 2015-07-30
  • 2013-07-12
  • 1970-01-01
  • 2013-06-30
  • 2022-10-06
  • 2016-02-20
  • 1970-01-01
  • 2017-02-19
  • 1970-01-01
相关资源
最近更新 更多