SQLAlchemy:“ NoneType”对象没有属性“ drivername”

时间:2019-10-19 23:13:57

标签: python flask sqlalchemy flask-sqlalchemy

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

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

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

这是我的project_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)

class User(db.Model):
    __tablename__ = 'example'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)

    def __init__(self, username, email):
        self.username = username
        self.email = email

    def __repr__(self):
        return '<User %r>' % self.username

db.create_all()
db.session.commit()

admin = User('admin', 'admin@example.com')
guest = User('guest', 'guest@example.com')
db.session.add(admin)
db.session.add(guest)
db.session.commit()

users = User.query.all()
print(users)

最后这是我的切入点:

#run.py
from project_name import app

if __name__ == '__main__':
    app.run(debug=True)

但是,在SQLAlchemy库中经过长时间的堆栈跟踪之后,出现以下错误:

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

我正在尝试通过以下关于stackoverlow的教程和答案来完成这项工作,以解决类似的问题,但是到目前为止,它们都没有帮助我。

我在这里想念什么?我的mysql驱动程序名称怎么了?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

如果你曾经在你的models.py中使用过“db.Model.metadata.reflect(db.engine)”,你仍然会得到同样的错误信息。 因此,按照@MattSom 的建议将驱动程序名称 mysqldb 更改为 pymysql 并注释或删除 这个指令“db.Model.metadata.reflect(db.engine)”