[英]Connecting psycopg2 with Python in Heroku
几天来,我一直在尝试在没有 Django 的情况下将我的 python 3 脚本连接到 Heroku 中的 PostgresSQL 数据库( psycopg2
)。
我找到了一些文章和相关问题,但我不得不投入大量时间来获得一些我认为应该非常简单的东西,即使对于像我这样的新手也是如此。
我最终以某种方式使其工作,但希望发布问题(和答案)将帮助其他人更快地实现它。
当然,如果有人有更好的方法,请分享。
正如我所说,我有一个 python 脚本,我想使用 Heroku 从云中运行它。 不涉及 Django(只是一个脚本/刮板)。
一开始我觉得有帮助的文章,即使它们还不够:
主要步骤:
1. 进程文件
Procfile
必须是:
worker: python3 folder/subfolder/myscript.py
2. Heroku 插件
附加Heroku Postgres :: Database
添加到 heroku 帐户中相应的个人应用程序中。
为了确保正确设置,这非常有帮助。
3. 带有db连接的Python脚本
最后,为了在我的 python 脚本myscript.py
中创建连接,我将这篇文章作为参考并将其改编为 Python 3:
import psycopg2
import urllib.parse as urlparse
import os
url = urlparse.urlparse(os.environ['DATABASE_URL'])
dbname = url.path[1:]
user = url.username
password = url.password
host = url.hostname
port = url.port
con = psycopg2.connect(
dbname=dbname,
user=user,
password=password,
host=host,
port=port
)
要创建一个新数据库, 这个 SO question解释了它。 关键线是:
con.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)
您可以使用 SQLALCHEMY 库来完成。 首先,您需要使用 pip 安装 SQLALCHEMY 库,如果您的计算机上没有安装 pip,您将知道如何使用简单的 google 搜索
点安装 sqlalchemy
这是执行您想要的代码片段:
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
import os
# Put your URL in an environment variable and connect.
engine = create_engine(os.getenv("DATABASE_URL"))
db = scoped_session(sessionmaker(bind=engine))
# Some variables you need.
var1 = 12
var2 = "Einstein"
# Execute statements
db.execute("SELECT id, username FROM users WHERE id=:id, username=:username"\
,{"id": var1, "username": var2}).fetchall()
# Don't forget to commit if you did an insertion,etc...
db.commit()
如上所述,我无法使用 urllib.parse 解析 Heroku 提供的 DATABASE_URL,但以下内容对我有用:
我从 Heroku 检索到的 URL 格式如下:
postgres://username:password@host:port/database
例如:
postgres://jticiuimwernbk:ff78903549d4c6ec13a53a8ffefcd201b937d54c35d976 @ec2-52-123-182-987.compute-1.amazonaws.com:5432/dbsd4fdf6c1awq
所以我手动剖析如下:
user = 'jticiuimwernbk'
password = 'ff78903549d4c6ec13a53a8ffefcd201b937d54c35d976'
host = 'ec2-52-123-182-987.compute-1.amazonaws.com'
port = '5432'
database = 'dbsd4fdf6c1awq'
#Then created the connection using the above:
con = psycopg2.connect(database=database,
user=user,
password=password,
host=host,
port=port)
# and now I was able to perform queries:
cur = conn.cursor()
results = cur.execute("<some SQL query>;").fetchall()
cur.close()
conn.close()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.