我有一个python脚本(list.py),用于与postgresql数据库交互。
import os
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
engine = create_engine(os.getenv("postgresql://postgres:nehal@localhost:5432/lecture3"))
db = scoped_session(sessionmaker(bind=engine))
def main():
flights = db.execute("SELECT origin, destination, duration FROM flights").fetchall()
for flight in flights:
print(f"{flight.origin} to {flight.destination}, {flight.duration} minutes.")
if __name__ == "__main__":
main()
我在Ubuntu 16.04上安装了postgresql,讲座3作为数据库。当我执行python list.py
代码时,出现以下错误:
Traceback (most recent call last):
File "list.py", line 5, in <module>
engine = create_engine(os.getenv("postgresql://postgres:nehal@localhost:5432/lecture3"))
File "/home/nehal/anaconda3/lib/python3.6/site-packages/sqlalchemy/engine/__init__.py", line 424, in create_engine
return strategy.create(*args, **kwargs)
File "/home/nehal/anaconda3/lib/python3.6/site-packages/sqlalchemy/engine/strategies.py", line 52, in create
plugins = u._instantiate_plugins(kwargs)
AttributeError: 'NoneType' object has no attribute '_instantiate_plugins'
postgres是postgresql用户名,nehal是密码。 如何更正错误?
答案 0 :(得分:2)
os.getenv
用于获取环境变量的值,如果该变量不存在,则默认返回None
。你传递的是你的连接字符串,它几乎可以肯定不存在于环境变量中。所以它返回None
,它被赋予create_engine
,它失败了,因为它期望一个连接字符串。只需直接传递您的连接字符串:
engine = create_engine("postgresql://postgres:nehal@localhost:5432/lecture3")
答案 1 :(得分:0)
我会尝试在没有getenv
的情况下运行它,这似乎没用,可能会返回None
create_engine("postgresql://postgres:nehal@localhost:5432/lecture3")
答案 2 :(得分:0)
为我工作:
export DATABASE_URL="postgres://localhost/lecture3"
export DATABASE_URL="postgres://localhost:5432/lecture3"
export DATABASE_URL="postgres:///lecture3"
您应该在ENV中使用此命令。
答案 3 :(得分:0)
在运行$ python list.py之前执行此操作 在哪里
username your psql username password your psql password server localhost or remote server port 5432 database your psql database
(flask) $ export DATABASE_URL="postgresql://username:password@localhost:5432/database"
验证:
(flask) $ echo $DATABASE_URL
运行:
$ python list.py
答案 4 :(得分:0)
对我来说,以下内容完美无缺
engine = create_engine("postgres://postgres:password@localhost:5432")
其中“ password”将代替您在安装PostgreSQL时使用的PostgreSQL密码。
答案 5 :(得分:-1)
如果您使用的是Windows,则在“系统变量”中进行设置可以解决此问题。例如在Windows 7上:单击“开始并键入计算机”,它将弹出计算机程序,单击“计算机”将打开计算机程序,单击“系统属性”选项卡,然后将弹出系统属性应用程序,现在单击“高级”。标签,然后您需要单击“环境变量”标签,这将打开包含用户变量和系统变量的对话框。单击系统变量上的“新建”选项卡,然后在变量名称中键入“ DATABASE_URL”,在变量值中键入“ postgres + psycopg2:// postgres:password @ localhost:5432 / postgres”。点赞“ OK” 使用cmd打开新的命令提示符。将目录更改为list.py程序所在的目录。就我而言,我在c:\ cs50 \ src3中有它,因此在打开cmd之后再打开cd c:\ cs50 \ src3。然后执行python list.py,您将看到类似的结果