Скрипт только вводит последнее значение в базу данных postgres - PullRequest
0 голосов
/ 30 мая 2019

Очень плохо знаком с Python.Я пытаюсь получить данные из RSS-канала, проанализировать данные и затем вставить данные в базу данных.Мой короткий фрагмент кода получает правильные элементы, и я могу напечатать результаты, но я могу получить только последний элемент в RSS-канале для публикации в базе данных.Я считаю, что я, возможно, неправильно определил "html" и "link".Я хочу, чтобы item.title и item.link заполнили список, который затем будет введен в базу данных в правильном порядке.Любая помощь высоко ценится.

import sys
import requests
import urllib2
import feedparser
import psycopg2
import psycopg2.extras
from psycopg2.extras import execute_values
import time

url = "https://www.ferc.gov/xml/whats-new.xml"
response = urllib2.urlopen(url).read()


#saving the xml file
response = requests.get(url)
#with open('whats_hot.xml', 'wb') as file:
#    file.write(response.content)


d = feedparser.parse('https://www.ferc.gov/xml/whats-new.xml')


for item in d.entries:
    print "------"
    print item.published
    print item.title
    print item.link
    html = item.published + item.title
    link = item.link



con = psycopg2.connect(database="xx", 
user="xx", password="xx", host="127.0.0.1", 
port="5432")  
print("Database opened successfully")

cur = con.cursor()



#try:
psycopg2.extras.execute_values(cur,
"insert into ferc_hots (link,html) values %s",
      [(link,html)])
#except psycopg2.IntegrityError:
#     print 'Duplicate values found.  Insert was not successful'

con.commit()  
print("Records inserted successfully")  
con.close()

Ответы [ 3 ]

1 голос
/ 30 мая 2019

Ваш оператор вставки также должен быть внутри цикла for.В противном случае вы вставляете только последнюю запись.

con = psycopg2.connect(database="xx", 
user="xx", password="xx", host="127.0.0.1", 
port="5432")  
print("Database opened successfully")

cur = con.cursor()

for item in d.entries:
    print "------"
    print item.published
    print item.title
    print item.link
    html = item.published + item.title
    link = item.link
    psycopg2.extras.execute_values(cur,"insert into ferc_hots (link,html) values %s",[(link,html)])

con.commit()  
print("Records inserted successfully")  
con.close()

Другой вариант - сохранить список записей и вставить их вместе в конце.

0 голосов
/ 30 мая 2019

html и ссылка - это просто однострочные значения.Они постоянно меняются в вашем цикле, но к тому времени, когда вы начинаете вставлять, им просто дается последнее заданное значение.Вам необходимо сохранить список значений, которые будут переданы на вставку.Обратите внимание, что двойные скобки связаны с тем, что в список значений добавляется кортеж.Кортеж определяется как (элемент, элемент), поэтому вы добавляете (элемент, элемент), а не просто элемент.

values = []
for item in d.entries:
    print "------"
    print item.published
    print item.title
    print item.link
    values.append((item.link, item.published + item.title))

...

psycopg2.extras.execute_values(cur,
    "insert into ferc_hots (link,html) values %s",
        values)
0 голосов
/ 30 мая 2019

Список аргументов для execute_values должен быть «последовательностью последовательностей». Какой список списков (или список кортежей). В вашем случае вы оставляете только конечные значения элементов в html и link и, таким образом, предоставляете только один элемент.

Вы хотите что-то вроде этого:

args = []
for item in d.entries:
    print "------"
    print item.published
    print item.title
    print item.link
    args.append([item.published + item.title, item.link])

Или одним махом:

args = [[item.published + item.title, item.link] for item in d.entries]

Тогда вставка выглядит примерно так:

psycopg2.extras.execute_values(cur,
          "insert into ferc_hots (link,html) values %s",
          args)
...