Feedparser: вставить в pg, если не существует

У меня есть несколько вопросов по этому поводу. Поэтому я пытаюсь использовать feedparser и psycopg. Проблема в том, что я не хочу дублировать данные.

    def dbFeed():
conn_string ="host='localhost' dbname='rss_feed' user='postgres' password='somepassword'"
print ("Connecting to dababase\n ->%s" %(conn_string))

try:
    conn = psycopg2.connect(conn_string)
    cursor = conn.cursor()
    print ("Connected!\n")
except:
    print ('Unable to connect to the database')


 feeds_to_parse=open("C:\\Users\\Work\\Desktop\\feedparser_entry_tests_world.txt","r")


for line in feeds_to_parse:
    parser = fp.parse(str(line))
    x = len(parser['entries'])
    count = 0   
    while count < x:

Теперь у меня есть несколько решений. Сначала я попробовал это:

cursor.execute("INSERT INTO feed (link, title, publication_date, newspaper) VALUES (%s, %s, %s, %s)",
        (parser['entries'][count]['link'], parser['entries'][count]['title'],
        parser['entries'][count]['published'],parser['feed']['title']))

Но, конечно, у меня были дублированные данные. Итак, я видел этот пост здесь: Избегание дублирования данных в базе данных PostgreSQL в Python < /а>

И я пробовал это, но у меня была ошибка индекса кортежа вне диапазона

cursor.execute("""INSERT INTO feed (link, title, publication_date, newspaper) SELECT %s, %s, %s, %s WHERE NOT EXISTS
              (feed.title FROM feed WHERE feed.title=%s);""",
            (parser['entries'][count]['link'], parser['entries'][count]['title'],
            parser['entries'][count]['published'],parser['feed']['title']))

Но в любом случае, это не то, как я хочу это сделать. Я хочу добавить условие в свой цикл while, которое проверяет наличие данных перед вставкой, потому что я не хочу проверять всю базу данных, я хочу проверять только последние записи. Еще раз, конечно, это не работает, потому что я думаю, что parser['entries'][count]['title'] не то, что я думаю...

while count < x:
    if parser['entries'][count]['title'] != cursor.execute("SELECT feed.title FROM feed WHERE publication_date > current_date - 15"):

cursor.execute("INSERT INTO feed (link, title, publication_date, newspaper) VALUES (%s, %s, %s, %s)",
        (parser['entries'][count]['link'], parser['entries'][count]['title'],
        parser['entries'][count]['published'],parser['feed']['title']))




conn.commit()

cursor.close()
conn.close()

person whiplash    schedule 30.04.2015    source источник


Ответы (1)


Вы должны добавить второй заголовок, который используется в части where, также вы можете добавить туда дополнительные условия:

cursor.execute(
    "INSERT INTO feed (link, title, publication_date, newspaper) "
    "SELECT %s, %s, %s, %s WHERE NOT EXISTS (SELECT 1 FROM feed "
    "WHERE title = %s AND publication_date > current_date - 15);",
    (parser['entries'][count]['link'],
     parser['entries'][count]['title'],
     parser['entries'][count]['published'],
     parser['feed']['title'],
     parser['feed']['title']))
person Imre L    schedule 30.04.2015
comment
Я думаю, что последнюю строку следует заменить на parser['entries'][count]['title'], потому что я проверяю названия статей. Во всяком случае, это работает, за исключением 3 газет... Спасибо! - person whiplash; 30.04.2015