У меня есть несколько вопросов по этому поводу. Поэтому я пытаюсь использовать 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()