简体   繁体   English

create_engine 中的 Flask SQLAlchemy KeyError 'False'

[英]Flask SQLAlchemy KeyError 'False' in create_engine

I have a flask app that connects with mysql using sqlalchemy.我有一个使用 sqlalchemy 与 mysql 连接的烧瓶应用程序。 A strange error happens on DB query.数据库查询发生奇怪的错误。

`Traceback (most recent call last): File "/home/Desktop/work/nesting-app/env/lib/python3.8/site-packages/sqlalchemy/util/_collections.py", line 1008, in call return self.registry[key] KeyError: <greenlet.greenlet object at 0x7f22a0936a90 (otid=0x7f22a08ef100) current active started main> `回溯(最近一次通话):文件“/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>

During handling of the above exception, another exception occurred:在处理上述异常的过程中,又发生了一个异常:

Traceback (most recent call last): File "/home/Desktop/work/nesting-app/server/users/routes.py", line 28, in register_new_user if form.validate_on_submit(): File "/home/Desktop/work/nesting-app/env/lib/python3.8/site-packages/flask_wtf/form.py", line 100, in validate_on_submit return self.is_submitted() and self.validate() File "/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", line 150, in validate if not field.validate(self, extra): File "/home/Desktop/work/nesting-app/env/lib/python3.8/site-packages/wtforms/fields/core.py", line 226, in validate stop_validation = self._run_validation_chain(form, chain) File "/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回溯(最近一次调用):文件“/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", line 43, in validate_email user = User.query.filter_by(email=email.data).first() File "/home/Desktop/work/nesting-app/env/lib/python3.8/site-packages/flask_sqlalchemy/ init .py", line 552, in get return type.query_class(mapper, session=self.sa.session()) File "/home/Desktop/work/nesting-app/env/lib/python3.8/site-packages/sqlalchemy/orm/scoping.py", line 47, in call sess = self.registry() File "/home/Desktop/work/nesting-app/env/lib/python3.8/site-packages/sqlalchemy/util/ collections.py", line 1010, in call return self.registry.setdefault(key, self.createfunc()) File "/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", line 176, in init bind = options.pop('bind', None) or db.engine File "/home/Desktop/work/nesting-app/env/lib/python3.8/site-packages/flask_sqlalchemy/ init .py", line 998, in engi .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 return self.get_engine() File "/home/Desktop/work/nesting-app/env/lib/python3.8/site-packages/flask_sqlalchemy/ init .py", line 1017, in get_engine return connector.get_engine() File "/home/Desktop/work/nesting-app/env/lib/python3.8/site-packages/flask_sqlalchemy/ init .py", line 594, in get_engine self._engine = rv = self._sa.create_engine(sa_url, options) File "/home/Desktop/work/nesting-app/env/lib/python3.8/site-packages/flask_sqlalchemy/ init .py", line 1027, in create_engine return sqlalchemy.create_engine(sa_url, **engine_opts) File "", line 2, in create_engine File "/home/Desktop/work/nesting-app/env/lib/python3.8/site-packages/sqlalchemy/util/deprecations.py", line 298, in warned return fn(*args, **kwargs) File "/home/Desktop/work/nesting-app/env/lib/python3.8/site-packages/sqlalchemy/engine/create.py", line 661, in create_engine engine = engineclass(pool, dialect, u, **engine_args) File "/home/Desktop/work/nesting-app/env/lib/python3.8/site-packages/sqlalchemy/engine/base. 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", line 2758, in init self.echo = echo File "/home/Desktop/work/nesting-app/env/lib/python3.8/site-packages/sqlalchemy/log.py", line 225, in set instance_logger(instance, echoflag=value) File "/home/Desktop/work/nesting-app/env/lib/python3.8/site-packages/sqlalchemy/log.py", line 202, in instance_logger logger = InstanceLogger(echoflag, name) File "/home/Desktop/work/nesting-app/env/lib/python3.8/site-packages/sqlalchemy/log.py", line 103, in init if self._echo_map[echo] <= logging.INFO and not self.logger.handlers: KeyError: 'False' ` 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' `

Here is the config.py这是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')

Here is the init.py这是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)

I have tried with different connection strings:我尝试过不同的连接字符串:

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

Thank you for any help.感谢您的任何帮助。

The echo flag for SQLAlchemy's create_engine function accepts a limited set of values: None , False , True , "debug" ( source ). SQLAlchemy 的create_engine函数的echo标志接受一组有限的值: NoneFalseTrue"debug" ( source )。

The traceback shows that the string "False" is being passed: KeyError: 'False' .回溯显示正在传递字符串"False"KeyError: 'False' In fact, the error can be reproduced by passing any string (except "debug") as the value of create_engine 's echo flag:实际上,可以通过传递任何字符串(“debug”除外)作为create_engineecho标志的值来重现错误:

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

results in结果是

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

At a guess, the problem is that猜测,问题是

SQLALCHEMY_ECHO = environ.get('SQLALCHEMY_ECHO')

does not consider that environment variables are always strings.不考虑环境变量总是字符串。 Something like this might be better:这样的事情可能会更好:

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

as it will result in a boolean value being assigned.因为它会导致分配一个布尔值。

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

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