【问题标题】:SQLAlchemy: 'NoneType' object has no attribute 'drivername'SQLAlchemy:“NoneType”对象没有属性“驱动程序名”
【发布时间】:2019-10-19 23:13:57
【问题描述】:

我正在尝试将我的烧瓶应用程序连接到我的本地 MySQL 数据库进行测试。我已经制作了一个烧瓶对象和一个类来表示一个要在成功连接后创建的示例表。

这些是我的项目的本地环境变量:

#.env
LOCAL_MYSQL_URL = mysql://Username:somePassword@127.0.0.1:3306/database_name

这是我的项目名称__init__ 文件:

#__init__.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import os

ON_HEROKU = 'ON_HEROKU' in os.environ

if ON_HEROKU:
    DB_URL = os.environ.get('CLEARDB_DATABASE_URL')
else:
    DB_URL = os.environ.get('LOCAL_MYSQL_URL')

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = DB_URL
app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY')

db = SQLAlchemy(app)  
db.create_all()
db.session.commit()

但是运行应用程序后出现以下错误:

  if sa_url.drivername.startswith('mysql'):
AttributeError: 'NoneType' object has no attribute 'drivername'

我正在尝试按照在 stackoverlow 上为类似问题提供的教程和答案来完成这项工作,但到目前为止,它们都没有帮助我。

我在这里缺少什么?我的 mysql 驱动名称有什么问题?

【问题讨论】:

  • 如果您将这一行更改为KeyError 是否会引发DB_URL = os.environ.get('LOCAL_MYSQL_URL')os.environ['LOCAL_MYSQL_URL']
  • @SuperShoot 是的。我已经按照你的方式尝试过了,我得到了:raise KeyError(key) from None KeyError: 'MYSQL_URL'
  • "我的mysql驱动名有什么问题?":'NoneType' object has no attribute 'drivername'表示sa_urlNone,驱动名没有问题,只是你传递给flask的url- sqlalchemy 是 NoneNone.drivername 不存在。
  • 我不得不使用 pymysql 来让它工作。 pip install pymysql
  • @MattSom 与您的评论直接冲突,您说在没有 .get() 的情况下访问 env var 时出现关键错误。我不知道从这里去哪里。

标签: python flask sqlalchemy flask-sqlalchemy


【解决方案1】:

确保 SQLAlchemy URI 在pip install pymysql 之后类似于此格式

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://{DB_USERNAME}:{DB_PASSWORD}@localhost:3306/{DB_NAME}'

【讨论】:

  • 奇怪。为什么我需要+pymysql 驱动程序?根据the docs 我只需要mysql。我试过了,我得到了同样的错误。
  • 这是 Python 3 的 mysql 驱动程序。我认为您配置 uri 错误。试试这个app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:password@localhost/db_name'
  • 哇,你是对的!在你的第一个建议之后我打错了,我写了+pymsql而不是+pymysql。再试一次,现在数据库有两行了!谢谢你,先生! :)
  • 这太疯狂了。今天早上再次尝试并抛出同样的错误。对于相同的代码。
  • 好的,我知道出了什么问题。首先,我没有像 cicnh 建议的那样包含 pymysql 驱动程序。另一方面,我什至没有使用 dotenv 模块来读取 .env 文件。出于某种原因,os.environ.get() 在创建后确实阅读了.env(我使用的是 VS Code),但今天早上它没有。所以使用dotenv 伙计们,不要让你的开发工具欺骗你。
【解决方案2】:

如果您曾经在您的 models.py 中使用“db.Model.metadata.reflect(db.engine)”,您仍然会收到相同的错误消息。 因此,按照@MattSom 的建议将驱动程序名称 mysqldb 更改为 pymysql 并评论或删除 本指令“db.Model.metadata.reflect(db.engine)”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 2018-11-17
    相关资源
    最近更新 更多