Flask-SQLAlchemy PostgreSQL 获取 AttributeError: 'NoneType' 对象没有属性 'drivername'

时间:2021-01-29 17:17:14

标签: python postgresql flask sqlalchemy flask-sqlalchemy

尝试从 Flask 应用程序连接到本地主机上现有的空 PostgreSQL 数据库时,我收到“AttributeError: 'NoneType' object has no attribute 'drivername'”。

这里是 .env:

...
SQLALCHEMY_DATABASE_URI='postgresql+psycopg2://postgres:PASSWORD@localhost/DATABASE' 
...

这里的配置:

import os

basedir = os.path.abspath(os.path.dirname(__file__))

class Config(object):
    DEBUG = False
    TESTING = False
    SECRET_KEY = os.environ.get('SECRET_KEY')
    SQLALCHEMY_DATABASE_URI = os.environ.get('SQLALCHEMY_DATABASE_URI')
    SQLALCHEMY_TRACK_MODIFICATIONS = False

class ProdConfig(Config):
    DEBUG = False

class StagingConfig(Config):
    DEVELOPMENT = True
    DEBUG = True

class DevConfig(Config):
    DEVELOPMENT = True
    DEBUG = True

class TestConfig(Config):
    TESTING = True

这是 app.extensions:

from flask_sqlalchemy import SQLAlchemy

db=SQLAlchemy()
...

这里是 __init__:

from flask import Flask, Blueprint...
from . config import Config
from flask_login import LoginManager
from flask_migrate import Migrate
from pathlib import Path

login_manager = LoginManager()
login_manager.login_view = 'auth.login'

def create_app():
    app = Flask(__name__,
                static_url_path='',
                static_folder='../app/static',
                template_folder='../app/templates')

    app.config.from_object(Config)

    from .extensions import db
    db.init_app(app)

    Migrate(app, db)
    
    from .templates.auth import auth_bp
    from .views.main import main_bp

    app.register_blueprint(main_bp)
    app.register_blueprint(auth_bp, url_prefix='/auth')

    login_manager.init_app(app)

    return app

我检查了以下 Stackoverflow 答案:

db.create_all() 'NoneType' object has no attribute 'drivername',

SQLAlchemy: 'NoneType' object has no attribute 'drivername',

SQLAlchemy cannot connect to Postgresql on localhost,

Flask app gives a " 'NoneType' object has no attribute 'drivername' " error

并且所有这些似乎都指向 SQLALCHEMY_DATABASE_URI 声明中的错误。

这不能解决我的问题。我试过了

>>> from app.extensions import db
>>> db.create_all()

>>> from app import create_app 
>>> app = create_app()
>>> from app.extensions import db
>>> db.create_all()

>>> from app import create_app
>>> app=create_app()
>>> app.app_context().push() 
>>> from app.extensions import db
>>> db.create_all()

结果是一样的。

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\...\venv\lib\site-packages\flask_sqlalchemy\__init__.py", line 1039, in create_all
    self._execute_for_all_tables(app, bind, 'create_all')
  File "C:\Users\...\venv\lib\site-packages\flask_sqlalchemy\__init__.py", line 1031, in _execute_for_all_tables        
    op(bind=self.get_engine(app, bind), **extra)
  File "C:\Users\...\venv\lib\site-packages\flask_sqlalchemy\__init__.py", line 962, in get_engine
    return connector.get_engine()
  File "C:\Users\...\venv\lib\site-packages\flask_sqlalchemy\__init__.py", line 555, in get_engine
    options = self.get_options(sa_url, echo)
  File "C:\Users\...\venv\lib\site-packages\flask_sqlalchemy\__init__.py", line 570, in get_options
    self._sa.apply_driver_hacks(self._app, sa_url, options)
  File "C:\Users\...\venv\lib\site-packages\flask_sqlalchemy\__init__.py", line 883, in apply_driver_hacks
    if sa_url.drivername.startswith('mysql'):
AttributeError: 'NoneType' object has no attribute 'drivername'

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

由@rfkortekaas 解决:

>>> from dotenv import load_dotenv
>>> load_dotenv()
>>> import os
>>> os.getenv('SQLALCHEMY_DATABASE_URI')
>>> from app import create_app
>>> app = create_app()
>>> app.app_context().push()   
>>> from app.extensions import db
>>> db.create_all()
相关问题