我从Python开始,目前正在编写一个脚本,该脚本从API获取数据,对其进行处理并将其保存在Postgresql数据库中。 我正在使用Django和Postgresql,它们都已被docker化。
代码正在从API获取数据并向我显示,因此该部分正常。现在的问题是我如何将其保存在数据库中。
我曾经在PHP中使用Symfony做到这一点,这很像这样:
PHP / Symfony
/*Movie*/
$movie_imdb_id = 'NULL';
$movie_status = $value->isPlaying;
$movie = new Movie();
$movie->setImdbId($movie_imdb_id);
$movie->setStatus($movie_status);
$entityManager->persist($movie);
$entityManager->flush();
我想做完全一样的事情,但是用Python。 到目前为止,这是我的脚本。
Python / Django
#RestfulClient.py
import requests
from requests.auth import HTTPDigestAuth
import json
import psycopg2
conn = psycopg2.connect(database="database", user="user", password="password", host="host", port="port")
url = "url_api"
myResponse = requests.get(url, verify = True)
if(myResponse.ok):
jData = json.loads(myResponse.content)
for f in jData:
#print(json.dumps(jData, indent = 4, sort_keys = True))
cur = conn.cursor()
cur.execute("INSERT INTO table VALUES ('value', 'value')")
conn.commit()
else:
myResponse.raise_for_status()
我的主要问题是,如何插入我在Postgres表中获得的数据,因为它们是对象。
感谢您的帮助!
编辑1
因此,在阅读@Chris发布的指南后,我将代码重新编写为更具可读性
Python 2
import json
import urllib3
import psycopg2
conn = psycopg2.connect(database="pp-db", user="root", password="root", host="db", port="5432")
cur = conn.cursor()
http = urllib3.PoolManager()
url = "https://api-content.ingresso.com/v0/theaters"
try:
response = http.request('GET', url)
data = json.loads(response.data.decode('utf-8'))
for i in data:
cityName = None
uf = None
cityName = i['cityName']
uf = i['uf']
cur.execute("INSERT INTO city VALUES(%s, %s)", (cityName, uf))
conn.commit()
cur.close()
except IOError as io:
print("ERROR!")
好的,到目前为止,还不错,但是当我执行脚本时,它返回一个错误:
psycopg2.DataError: invalid input syntax for integer: "Rio de Janeiro"
我想这可能是因为我忘记了传递 id
的原因,因为此表具有(id,cityName,uf)。
我必须在表格中手动插入ID吗?
我已经创建了一个索引作为ID键。一切正常。
答案 0 :(得分:0)
因此,经过一些编码,我终于成功了。这是我编写的代码。 不过,我很确定还有更好的方法可以做到这一点,尽管如此。
PYTHON-工作
import json
import urllib3
import psycopg2
conn = psycopg2.connect(database="db", user="user", password="pass", host="host", port="port")
cur = conn.cursor()
http = urllib3.PoolManager()
url = "https://url"
try:
response = http.request('GET', url)
data = json.loads(response.data.decode('utf-8'))
index = 0 #I'm using index as an id_key
for i in data:
var1 = None
var2 = None
var1 = i['var1']
var2 = i['var2']
cur.execute("""
INSERT INTO table
VALUES (%s, %s, %s);
""",
(index, var1, var2))
conn.commit()
index += 1
cur.close()
except IOError as io:
print("ERROR!")