繁体   English   中英

create_engine 中的 Flask SQLAlchemy KeyError 'False'

[英]Flask SQLAlchemy KeyError 'False' in create_engine

我有一个使用 sqlalchemy 与 mysql 连接的烧瓶应用程序。 数据库查询发生奇怪的错误。

`回溯(最近一次通话):文件“/home/Desktop/work/nesting-app/env/lib/python3.8/site-packages/sqlalchemy/util/_collections.py”,第 1008 行,在调用中返回 self .registry[key] KeyError: <greenlet.greenlet object at 0x7f22a0936a90 (otid=0x7f22a08ef100) current active started main>

在处理上述异常的过程中,又发生了一个异常:

回溯(最近一次调用):文件“/home/Desktop/work/nesting-app/server/users/routes.py”,第 28 行,在 register_new_user 中,如果 form.validate_on_submit():文件“/home/Desktop/work /nesting-app/env/lib/python3.8/site-packages/flask_wtf/form.py”,第 100 行,在 validate_on_submit 中返回 self.is_submitted() 和 self.validate() 文件“/home/Desktop/work/ nesting-app/env/lib/python3.8/site-packages/wtforms/form.py", line 318, in validate return super(Form, self).validate(extra) File "/home/Desktop/work/nesting -app/env/lib/python3.8/site-packages/wtforms/form.py”,第 150 行,如果不是 field.validate(self,extra):文件“/home/Desktop/work/nesting-app /env/lib/python3.8/site-packages/wtforms/fields/core.py”,第 226 行,在验证 stop_validation = self._run_validation_chain(form, chain) 文件中“/home/Desktop/work/nesting-app/ env/lib/python3.8/site-packages/wtforms/fields/core.py", line 246, in _run_validation_chain validator(form, self) File "/home/Desktop/work/nesting-app/server/users/forms .py”,第 43 行,在 validate_email user = User.query.filter_by(email=email.data).first() 文件“/home/Desktop/work/nesting-app/env/lib/python3.8/site-包/flask_sqlalchemy/ init .py”,第 552 行,在get return type.query_class(mapper, session=self.sa.session()) 文件“/home/Desktop/work/nesting-app/env/lib/python3. 8/site-packages/sqlalchemy/orm/scoping.py”,第 47 行,调用sess = self.registry() 文件“/home/Desktop/work/nesting-app/env/lib/python3.8/site- package/sqlalchemy/util/ collections.py”,第 1010 行,在调用return self.registry.setdefault(key, self.createfunc()) 文件“/home/Desktop/work/nesting-app/env/lib/python3. 8/site-packages/sqlalchemy/orm/session.py", line 4171, in call return self.class (**local_kw) File "/home/Desktop/work/nesting-app/env/lib/python3.8/ site-packages/flask_sqlalchemy/ init .py”,第 176 行,在init bind = options.pop('bind', None) 或 db.engine 文件“/home/Desktop/work/nesting-app/env/lib/python3 .8/site-packages/flask_sqlalchemy/ init .py", line 998, in engi NE回报self.get_engine()文件“/home/Desktop/work/nesting-app/env/lib/python3.8/site-packages/flask_sqlalchemy/初始化的.py”,线1017,在get_engine回报connector.get_engine()文件“/home/Desktop/work/nesting-app/env/lib/python3.8/site-packages/flask_sqlalchemy/ INIT py”为,线594,在get_engine self._engine = RV = self._sa.create_engine(sa_url ,选项)文件“/home/Desktop/work/nesting-app/env/lib/python3.8/site-packages/flask_sqlalchemy/初始化的.py”,线1027,在create_engine回报sqlalchemy.create_engine(sa_url,** engine_opts ) 文件“”,第 2 行,在 create_engine 文件“/home/Desktop/work/nesting-app/env/lib/python3.8/site-packages/sqlalchemy/util/deprecations.py”,第 298 行,警告返回fn(*args, **kwargs) 文件“/home/Desktop/work/nesting-app/env/lib/python3.8/site-packages/sqlalchemy/engine/create.py”,第 661 行,在 create_engine engine = engineclass(pool, dialect, u, **engine_args) 文件“/home/Desktop/work/nesting-app/env/lib/python3.8/site-packages/sqlalchemy/engine/base. py”,第 2758 行,在init self.echo = echo 文件“/home/Desktop/work/nesting-app/env/lib/python3.8/site-packages/sqlalchemy/log.py”,第 225 行,在集合中instance_logger(instance, echoflag=value) 文件“/home/Desktop/work/nesting-app/env/lib/python3.8/site-packages/sqlalchemy/log.py”,第 202 行,在 instance_logger logger = InstanceLogger(echoflag , name) 文件“/home/Desktop/work/nesting-app/env/lib/python3.8/site-packages/sqlalchemy/log.py”,第 103 行,在init if self._echo_map[echo] <= logging .INFO 而不是 self.logger.handlers: KeyError: 'False' `

这是config.py

from os import environ, path
from dotenv import load_dotenv
from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent
load_dotenv(path.join(BASE_DIR, '.env'))


class Config:
    SECRET_KEY = environ.get('SECRET_KEY')
    SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://user:password@127.0.0.1:3306/dbname'
    # SQLALCHEMY_ECHO: When set to 'True', Flask-SQLAlchemy will log all database
    # activity to Python's stderr for debugging purposes.
    SQLALCHEMY_ECHO = environ.get('SQLALCHEMY_ECHO')
    #  To suppress the warning "this option takes a lot of system resources" set
    SQLALCHEMY_TRACK_MODIFICATIONS = environ.get('SQLALCHEMY_TRACK_MODIFICATIONS')

这是init.py

db = SQLAlchemy()
bcrypt = Bcrypt()
login_manager = LoginManager()
login_manager.login_view = 'users.login'
mail = Mail()
csrf = CSRFProtect()


def create_app(config_class=Config):
    flask_app = Flask(__name__)
    flask_app.config.from_object(config_class)

    db.init_app(flask_app)
    bcrypt.init_app(flask_app)
    login_manager.init_app(flask_app)
    mail.init_app(flask_app)
    csrf.init_app(flask_app)

我尝试过不同的连接字符串:

SQLALCHEMY_DATABASE_URI=mysql+mysqlconnector://user:pass@localhost:3306/dbname

SQLALCHEMY_DATABASE_URI=mysql+mysqlconnector://user:pass@localhost/dbname

SQLALCHEMY_DATABASE_URI=mysql+mysqlconnector://user:pass@127.0.0.1:3306/dbname

感谢您的任何帮助。

SQLAlchemy 的create_engine函数的echo标志接受一组有限的值: NoneFalseTrue"debug" ( source )。

回溯显示正在传递字符串"False"KeyError: 'False' 实际上,可以通过传递任何字符串(“debug”除外)作为create_engineecho标志的值来重现错误:

create_engine('sqlite://', echo='banana')

结果是

Traceback (most recent call last):
   ...
KeyError: 'banana'

猜测,问题是

SQLALCHEMY_ECHO = environ.get('SQLALCHEMY_ECHO')

不考虑环境变量总是字符串。 这样的事情可能会更好:

SQLALCHEMY_ECHO = environ.get('SQLALCHEMY_ECHO') in ('1', 'True')

因为它会导致分配一个布尔值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM