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

时间:2010-03-10 09:55:05

标签: python postgresql psycopg2

我正在研究PostgreSQL和psycopg2。试 获取每10分钟后更新的饲料数据 并将此Feed内容保存在PostgreSQL数据库中。我的目标是检索 并从该表中打印这些数据。 但是由于在表上插入操作,每次运行该脚本时,由于重复数据也存在数据库中,因此面临问题。

为了摆脱这个问题,我在表location_title中对列Locations-musiq1进行了主键约束,我打算存储我的Feed数据。但是面临错误。

这是我的代码:

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()

将“locations_musiq1”表格列“location_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"

任何人都有任何想法摆脱这个问题吗?..提前谢谢..

3 个答案:

答案 0 :(得分:2)

您的代码只有INSERT,那么您认为在第二次获取相同数据时会发生什么?

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

您需要将Feed中的条目与表格匹配,并根据需要匹配INSERT,UPDATE,DELETE。适当时由Feed数据和同步原因定义。或者您清空表格并每次从Feed中填充它。

你想要达到什么目标?

答案 1 :(得分:2)

您可以尝试这样的事情:

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))

答案 2 :(得分:1)

拉​​赫曼。你在评论中提出第二个问题,而不应该将其转化为自己的问题。

无论如何以指定的顺序返回结果,您需要order by子句。我没有在这里看到时间戳列,但我假设您的Feed数据是以XML格式化的。你可以通过一些xpath表达式来订购。但是如果你只是按照插入的顺序想要它们,你可以按隐藏的系统列xmin排序,这是插入操作的事务ID。

请参阅system columns上的文档。