db.create_all()'NoneType'对象没有属性'drivername'

问题描述 投票:2回答:3

我正在使用Python和Javascript跟踪CS50的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'

我使用的代码是两个python文件:第一个名为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)

第二个文件名为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()

你能帮助我吗?!

python postgresql
3个回答
1
投票

我认为这是您尝试连接到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')

希望这是有道理的!


1
投票

检查线os.getenv("postgresql://postgres:password@localhost/database1")

它不包含环境变量的名称。

参考:https://docs.python.org/3/library/os.html?highlight=getenv#os.getenv

样品用法:

$ python
Python 3.7.0 (default, Aug 20 2018, 15:06:39) 
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os  
>>> editor = os.getenv('EDITOR')
>>> print(editor)
vi

1
投票

为了澄清gbajson的答案,os.getenv从特定的环境变量中获取值。您需要将数据库URI存储在env var中(在启动Flask之前)并从那里获取它:

app.config["SQLALCHEMY_DATABASE_URI"] = os.getenv("DATABASE_URI")

或者,在不使用getenv的情况下将其直接硬编码为字符串:

app.config["SQLALCHEMY_DATABASE_URI"] = "postgresql://postgres:password@localhost/database1"
© www.soinside.com 2019 - 2024. All rights reserved.