使用sqlalchemy连接到postgresql时出错

时间:2018-02-17 12:55:41

标签: python postgresql sqlalchemy

我有一个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是密码。 如何更正错误?

6 个答案:

答案 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,您将看到类似的结果

enter image description here