当前位置: 首页 > 知识库问答 >
问题:

烧瓶SQLAlChemy键错误'假'在create_engine

邓正谊
2023-03-14

我有一个烧瓶应用程序,与MySQL使用sqlalChemy连接。DB查询时发生奇怪的错误。

`回溯(最近一次调用):文件“/home/Desktop/work/nesting app/env/lib/python3.8/site packages/sqlalchemy/util/_collections.py”,第1008行,调用返回self。注册表[key]键错误:

在处理上述异常期间,发生了另一个异常:

Traceback(最后一次调用):File"/home/Desktop/work/nesting-app/server/user/routes.py",第28行,register_new_user如果form.validate_on_submit():File"/home/Desktop/work/nesting-app/env/lib/python3.8/site-pack/flask_wtf/form.py",第100行,validate_on_submit返回self.is_submitted()和self.validate()File"/home/Desktop/work/nesting-app/env/lib/python3.8/site-pack/wtform/form.py",第318行,验证返回超级(窗体,自我)。验证(额外的)文件”/home/Desktop/work/nesting-app/env/lib/python3.8/site-包/wtform/form.py”,第150行,在验证如果不是field.validate(自己,额外的):文件”/home/Desktop/work/nesting-app/env/lib/python3.8/site-包/wtform/_run_validation_chain(表单,链)File"/home/Desktop/work/nesting-app/env/lib/python3.8/site-包/wtform/field/core.py",第246行,_run_validation_chainvalidator(表单,自)File"/home/Desktop/work/nesting-app/server/user/forms.py",第43行,validate_emailuser=User.query.filter_by(email=email.data). first()File"/home/Desktop/work/nesting-app/env/lib/python3.8/site-包/flask_sqlalchemy/init.py",第552行,在获取返回type.query_class(mapper,session=self.sa.session())File"/home/Desktop/work/nesting-app/env/lib/python3.8/site-pack/sqlalChemy/orm/scoping.py",第47行,在调用sess=self.registry()File"/home/Desktop/work/nesting-app/env/lib/python3.8/site-pack/sqlalChemy/util/collections.py",第1010行,在调用返回self.registry.setdefault(key, Self. createfunc())File"/home/Desktop/work/nesting-app/env/lib/python3.8/site-包/sqlalChemy/orm/session. py",第4171行,在调用中返回自己. class(**local_kw)File"/home/Desktop/work/nesting-app/env/lib/python3.8/site-包/flask_sqlalchemy/init. py",第176行,在init bind=options. pop('bind',无)或db. Engine File"/home/Desktop/work/nesting-app/env/lib/python3.8/site-packages/flask_sqlalchemy/init.py",第998行,在引擎返回自身中。get_engine()File"/home/Desktop/work/nesting-app/env/lib/python3.8/site-包/flask_sqlalchemy/init. py",第1017行,在get_engine返回连接器中。get_engine()File"/home/Desktop/work/nesting-app/env/lib/python3.8/site-包/flask_sqlalchemy/init.py",第594行,get_engine自我。_engine=rv=自我。_sa。create_engine(sa_url,选项)File"/home/Desktop/work/nesting-app/env/lib/python3.8/site-包/flask_sqlalchemy/init. py",第1027行,create_engine返回sqlalChemy。create_engine(sa_url,**engine_opts)File",第2行,create_engineFile"/home/Desktop/work/nesting-app/env/lib/python3.8/site-包/sqlalChemy/util/decrecations. py",第298行,在警告返回fn(*args,**kwargs)File"/home/Desktop/work/nesting-app/env/lib/python3.8/site-包/sqlalChemy/Engine/create. py",第661行,在create_engineEngine=engineclass(池,方言,u,**engine_args)文件"/home/Desktop/work/nesting-app/env/lib/python3.8/site-Packes/sqlalChemy/Engine/base. py",第2758行,在init Self. echo=echo File"/home/Desktop/work/nesting-app/env/lib/python3.8/site-Packes/sqlalChemy/log. py",第225行,在集合中instance_logger(实例,echoflag=value)File"/home/Desktop/work/nesting-app/env/lib/python3.8/site-包/sqlalChemy/log. py",第202行,在instance_loggerlogger=InstanceLogger(echoflag,名称)File"/home/Desktop/work/nesting-app/env/lib/python3.8/site-包/sqlalChemy/log. py",第103行,在init中如果自我。_echo_map[回声]

这里是配置。派克

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')

这是初始化。派克

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

谢谢你的帮助。

共有1个答案

司空宣
2023-03-14

SQLAlchemy的创建引擎函数的echo标志接受一组有限的值:NoneFalseTrue“debug”(源代码)。

回溯显示正在传递字符串“False”KeyError:“False”。事实上,可以通过将任何字符串(除“debug”)作为create\u 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')

因为这将导致分配布尔值。

 类似资料:
  • 我正在建立一个小网站,我已经在SQLAlChemy中拥有了我所有的模型。该网站将发布一些离线计算的信息。只有结果将被发布到一个精简的数据库,即它包含结果,而不是原始数据,但网站需要查询结果。 我将使用Flask,因为我的模型已经用Python驱动了(通过SWIG在C中进行了一些繁重的工作),我不想使用Django。 我敢肯定,以前有人问过这个问题,通常没有太多理由的咒语是“使用炼金术”。问题是为什

  • 我有一个简单的数据库在mysql和我尝试打印结果,但编码是错误的。它发生在orm模型和纯sql模式中。 在相同的sqlalchemy conf下,纯使用工作而烧瓶应用程序不使用。我也试过用php进行简单的测试,它工作的还可以。 我做错了什么? Mysql变量 在config.py中 带有flask-script的命令 输出 python test.py 如果我在每个大小写中打印类型,唯一有效的大小

  • 我当前在运行flask代码时遇到以下错误: 瓶子调试助手。FormDataRoutingRedirect-FormDataRoutingRedirect:已向此URL发送请求(http://localhost:5000/login)但路由系统自动发出重定向到“http://localhost:5000/login/“。URL是用尾随斜杠定义的,因此如果在没有尾随斜杠的情况下访问,Flask将自动重

  • 我在这里遵循烧瓶教程: http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world 我达到了我尝试的程度/跑py和我得到: 这看起来类似于: ImportError:没有名为flask的模块 但他们的解决方案没有帮助。作为参考,我确实有一个名为flask的文件夹,其中一位用户提到该文件夹可能会导致问题

  • 我正在尝试使用mod_wsgi在Ubuntu 16.04上通过apache安装flask应用程序。问题是wsgi脚本无法导入任何python模块。 我已经验证了wsgi脚本是可执行的,并用python独立运行了它。我还验证了我的flask应用程序可以自己运行,没有错误。我能够在我运行的任何其他python程序中导入所有模块。我还安装了带有pip和源代码的烧瓶。似乎什么都没用。 这是我的错误日志:

  • 我正在学习Flask和Postman,目前,我正在尝试解决这个问题。下面是Python的代码行: 运行之后,当我去邮递员处运行以下命令时:获取:http://127.0.0.1:5000/get_chain控制台向我显示以下消息:错误:connect econnrefered127.0.0.1:5000