在Python中避免PostgreSQL数据库中的重复数据

在Python中避免PostgreSQL数据库中的重复数据,python,postgresql,psycopg2,Python,Postgresql,Psycopg2,我正在研究PostgreSQL和psycopg2。尝试 获取每10分钟更新一次的提要数据 并将其内容保存在PostgreSQL数据库中。我的目标是检索 然后打印表格中的数据。 但面临的问题是,由于表上的插入操作,每次运行该脚本时,重复数据也存储在数据库中 为了解决这个问题,我在表Locations-musiq1中设置了列location\u title的主键约束,以存储提要数据。但面临错误 这是我的密码: import psycopg2 import sys import feedparser

我正在研究PostgreSQL和psycopg2。尝试 获取每10分钟更新一次的提要数据 并将其内容保存在PostgreSQL数据库中。我的目标是检索 然后打印表格中的数据。 但面临的问题是,由于表上的插入操作,每次运行该脚本时,重复数据也存储在数据库中

为了解决这个问题,我在表
Locations-musiq1
中设置了列
location\u title
的主键约束,以存储提要数据。但面临错误

这是我的密码:

import psycopg2
import sys
import feedparser
import codecs
import psycopg2.extensions


# Parsing data from Geofeed location feeds

data = feedparser.parse("some URL")
psycopg2.extensions.register_type(psycopg2.extensions.UNICODE)



try:

    conn=psycopg2.connect("dbname='name' user='postgres' host='localhost'     password='abcds'")
    conn.set_client_encoding('UNICODE')


except:
    print "I am unable to connect to the database, exiting."
    sys.exit()
cur=conn.cursor()


for i in range(len(data['entries'])):
    cur.execute("INSERT INTO locations_musiq1(location, location_title) VALUES (%s, %s)",    (data.entries[i].title,data.entries[i].summary))
    conn.commit()
cur.execute("SELECT * FROM locations_musiq1;")
cur.fetchone()
for row in cur:
    print '   '.join(row[1:])


cur.close()
conn.close()
将“location\u musiq1”表列“location\u title”更改为主键后,我的错误是:

Traceback (most recent call last): File "F:\JavaWorkspace\Test\src\postgr_example.py", line 28, in cur.execute("INSERT INTO locations_musiq1(location, location_title) VALUES (%s, %s)", (data.entries[i].title,data.entries[i].summary)) psycopg2.IntegrityError: duplicate key value violates unique constraint "locations_musiq1_pkey" 回溯(最近一次呼叫最后一次): 文件“F:\JavaWorkspace\Test\src\postgr\u example.py”,第28行,在 cur.execute(“插入位置\u musiq1(位置,位置\u标题)值(%s,%s)”,(data.entries[i].title,data.entries[i].summary)) psycopg2.IntegrityError:重复的键值违反唯一约束“locations\u musiq1\u pkey”
任何人都能想出解决这个问题的办法吗?。提前谢谢。

您的代码只有
INSERT
,那么当您再次获取相同的数据时,您认为会发生什么情况

更新失败,因为您正尝试插入一行,该行的字段值与具有唯一约束的列中已存在的字段值相同

您需要将提要中的条目匹配到表中,并根据需要进行插入、更新和删除。在适当的情况下,由提要数据和同步原因定义。或者每次清空表并从提要填充它


你想达到什么目的?

你可以尝试以下方法:

cur.execute("""
  INSERT INTO locations_musiq1(location, location_title) 
  SELECT %s, %s WHERE NOT EXISTS 
      (SELECT location_title FROM locations_musiq1 WHERE location_title=%s);
  """, (data.entries[i].title, data.entries[i].summary, data.entries[i].summary))

拉赫曼。你在评论中提出了第二个问题,这个问题可能应该变成它自己的问题

无论如何,要以指定的顺序返回结果,您需要一个ORDERBY子句。我在这里没有看到时间戳列,但我假设您的提要数据是用XML格式化的。您可以通过一些xpath表达式进行排序。但是,如果您只希望按照插入顺序对它们进行排序,那么可以按照隐藏的系统列xmin进行排序,xmin是插入操作的事务id


请参阅上的文档。

谢谢您的回答!。。但我仍然面临着这样的问题:feed数据并没有按它们应该打印的顺序打印!。。就像他们显示的数据(我脚本输出数据的一部分):X在伦敦(2010-03-10 14:46:35.0)X在伦敦(2010-03-10 15:30:35.0)X在伦敦(2010-03-10 15:19:35.0)X在伦敦(2010-03-10 15:08:35.0)X在伦敦(2010-03-10 14:57:38.0)X在伦敦(2010-03-10 14:24:35.0)因此,您可以看到,所有这些都不是按顺序显示的,而是按顺序显示的!您知道如何按顺序显示所有这些吗???将它们插入数据库后,只需使用
select*from locations\u musiq1 order by mydatefield asc
(或desc)