我正在使用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()
你能帮助我吗?!
我认为这是您尝试连接到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')
希望这是有道理的!
检查线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
为了澄清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"