1. ホーム
  2. python

[解決済み] db.create_all() 'NoneType' オブジェクトに 'drivername' という属性がない。

2022-02-17 20:38:40

質問

CS50のPythonとJavascriptによるWebプログラミングを受講していますが、Lecture4でpostgresqlのデータベーステーブルを作成しようとすると以下のエラーが発生しました。

 Traceback (most recent call last):
  File "create.py", line 19, in <module>
    main()
  File "create.py", line 15, in main
    db.create_all()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/flask_sqlalchemy/__init__.py", line 963, in create_all
    self._execute_for_all_tables(app, bind, 'create_all')
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/flask_sqlalchemy/__init__.py", line 955, in _execute_for_all_tables
    op(bind=self.get_engine(app, bind), **extra)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/flask_sqlalchemy/__init__.py", line 896, in get_engine
    return connector.get_engine()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/flask_sqlalchemy/__init__.py", line 556, in get_engine
    self._sa.apply_driver_hacks(self._app, info, options)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/flask_sqlalchemy/__init__.py", line 830, in apply_driver_hacks
    if info.drivername.startswith('mysql'):
AttributeError: 'NoneType' object has no attribute 'drivername'

私が使用したコードは、2つのPythonファイルになっています。 最初の1つはmodels.pyと呼ばれるものです。

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class Flight(db.Model):
    __tablename__ = "flights"
    id = db.Column(db.Integer, primary_key=True)
    origin = db.Column(db.String, nullable=False)
    destination = db.Column(db.String, nullable=False)
    duration = db.Column(db.Integer, nullable=False)

class Passenger(db.Model):
    __tablename__ = "passengers"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String, nullable=False)
    flight_id = db.Column(db.Integer, db.ForeignKey("flight.id"), nullable=False)

2つ目のファイルはcreate.pyという名前です。

import os

from flask import Flask, render_template, request
from models import *

app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = os.getenv("postgresql://postgres:password@localhost/database1")
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
db.init_app(app)

def main():
    db.create_all()

if __name__ == "__main__":
    with app.app_context():
        main()

助けてくれませんか!?

解決方法は?

に接続しようとしている方法の問題だと思います。 Postgres データベースを使用します。

app.config["SQLALCHEMY_DATABASE_URI"] = os.getenv("postgresql://postgres:password@localhost/database1")

この行は、おそらく次のようにしたいのでしょう。

app.config["SQLALCHEMY_DATABASE_URI"] = "postgresql://postgres:password@localhost/database1"

となっているので os.getenv(...) は現在、あなたのシステム上の環境変数名を取得しようとしています。 "postgresql://postgres:password@localhost/database1" この名前の環境変数は設定されていないはずです。というわけで NoneType というエラーが発生します。 postgres ドライバを使用します。

AttributeError: 'NoneType' オブジェクトには 'drivername' という属性がありません。

環境変数でデータベース接続文字列を取得する場合は、以下のように .bash_profile または .bashrc ファイルを作成します。

export SQLALCHEMY_DATABASE_URI='postgresql://postgres:password@localhost/database1'

で、データベース接続コードを以下のように変更します。

app.config["SQLALCHEMY_DATABASE_URI"] = os.environ.get('SQLALCHEMY_DATABASE_URI')

これで納得していただけたでしょうか?