flask sqlite报错Neither SQLALCHEMY_DATABASE_URI nor SQLALCHEMY_BINDS is set. ?

新手上路,请多包涵

环境:wsl+flask
最近一直在跟着flask web的书学习flask框架,但是最近遇到了两个问题

  1. sqlalchemy的连接问题
  2. sqlite no such table的问题
    不知道以上两个问题是不是有联系的

首先是第一个问题,已经在config.py中设置了诸如sqlalchemy_database_uri和sqlalchemy_track_modification的属性,代码如下:
config.py

import os
basedir = os.path.abspath(os.path.dirname(__file__))

class Config:
    SECRET_KEY = os.environ.get("SECRET_KEY") or 'hard to guess string'
    MAIL_SERVER = os.environ.get("MAIL_SERVER","smtp.googlemail.com")
    MAIL_PORT = int(os.environ.get("MAIL_PORT",'587'))
    MAIL_USE_TLS = os.environ.get("MAIL_USE_TLS",'true').lower() in ['true','on','1']
    MAIL_USERNAME = os.environ.get("MAIL_USERNAME")
    MAIL_PASSWORD = os.environ.get("MAIL_PASSWORD")

    FLAKSY_MAIL_SUBJECT_PREFIX = '[Flasky]'
    FLASKY_MAIL_SENDER = 'Flasky Admin <flasky@example.com>'
    FLASKY_ADMIN = os.environ.get('FLASKY_ADMIN')
    SQLALCHEMY_TRACK_MODIFICATIONS = False

    
    @staticmethod
    def init_app(app):
        pass


class DevelopmentConfig(Config):
    DEBUG =True
    SQLALCHEMY_DATABASE_URI = os.environ.get('DEV_DATABASE_URL') or 'sqlite:///' +os.path.join(basedir,'data-dev.sqlite')

class TestingConfig(Config):
    TESTING = True
    SQLALCHEMY_DATABASE_URI = os.environ.get('TEST_DATABASE_URL') or 'sqlite:///'+os.path.join(basedir,'data-test.sqlite')

class ProductionConfig(Config):
    SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or 'sqlite:///' + os.path.join(basedir,'data.sqlite')

config = {
    'development': DevelopmentConfig,
    'testing': TestingConfig,
    'production': ProductionConfig,
    'default': DevelopmentConfig
}

def __main__():
    path =  os.environ.get('DEV_DATABASE_URL') or 'sqlite:///'+os.path.join(basedir,'data-dev.sqlite')
    print(path)
    print(type(path))
if __name__ == "__main__":
    __main__()

使用的过程如下:首先是app/__init__.py

from flask import Flask,render_template
from flask_bootstrap import Bootstrap
from flask_mail import Mail
from flask_moment import Moment
from flask_sqlalchemy import SQLAlchemy
from config import config
from flask_login import LoginManager


bootstrap=  Bootstrap()
mail = Mail()
moment = Moment()
db = SQLAlchemy()
login_manager = LoginManager()
login_manager.login_view='auth.login'

def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    config[config_name].init_app(app)

    bootstrap.init_app(app)
    mail.init_app(app)
    moment.init_app(app)
    db.init_app(app)
    login_manager.init_app(app)

    ## 添加路由和自定义的页面
    from .main import main as main_blueprint
    app.register_blueprint(main_blueprint)

    from .auth import auth as auth_blueprint
    app.register_blueprint(auth_blueprint,url_prefix='/auth')
    
    return app

然后在flasky.py中创建应用,flasky.py

import os 
from app import create_app,db
from app.models import User,Role
from flask_migrate import Migrate

app = create_app(os.getenv('FLASK_CONFIG') or 'default')
# app = create_app('default')
migrate = Migrate(app,db)

@app.shell_context_processor
def make_shell_context():
    return dict(db=db,User=User,Role=Role)

@app.cli.command()
def test():
    """run the unit tests"""
    import unittest
    tests = unittest.TestLoader().discover('tests')
    unittest.TextTestRunner(verbosity=2).run(tests)

但是在进入flask shell后还是会出现报错,如下:
UserWarning: Neither SQLALCHEMY_DATABASE_URI nor SQLALCHEMY_BINDS is set. Defaulting SQLALCHEMY_DATABASE_URI to "sqlite:///:memory:".
FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future. Set it to True or False to suppress this warning.

但是flask shell 中
输入db并回车又能够返回正常的
'<SQLAlchemy engine=sqlite:////mnt/d/flasky/data-dev.sqlite>'

目前网上还没找到和我有相同问题的情况

阅读 652
avatarAI BotBETA

你的问题与代码和程序运行有关,我会尽力帮助你解决。

从你提供的错误信息来看,问题似乎在于你的环境变量中没有设置 SQLALCHEMY_DATABASE_URI,而 Flask-SQLAlchemy 需要这个环境变量来知道在哪里找到数据库。在你的代码中,你在 DevelopmentConfigTestingConfigProductionConfig 中设置了 SQLALCHEMY_DATABASE_URI,但是这些设置只在配置类中有效,当你在 Flask shell 中运行时,可能没有使用正确的配置。

一种可能的解决方案是确保你在运行 Flask shell 时使用了正确的配置。你可以在创建应用时明确指定配置,如下所示:

app = create_app('development')  # 或者 'testing', 'production' 等

另一种可能的解决方案是,你可以在运行 Flask shell 之前设置 SQLALCHEMY_DATABASE_URI 环境变量。你可以使用 os.environ 来设置环境变量,如下所示:

import os
os.environ['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir,'data-dev.sqlite')

然后,你可以运行 Flask shell:

flask shell

请注意,你可能需要根据你的实际数据库位置和配置来调整这个路径。如果你在 Windows 上运行 WSL,你可能需要使用 Windows 的环境变量,而不是 WSL 的环境变量。你可能需要查阅如何在 WSL 中设置和使用 Windows 的环境变量。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏