2

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

为了摆脱这个问题,我对location_titleLocations-musiq1中的列进行了主键约束,我打算在其中存储我的提要数据。但面临错误。

这是我的代码:

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”更改为主键后我的错误是:

    回溯(最近一次通话最后):
      文件“F:\JavaWorkspace\Test\src\postgr_example.py”,第 28 行,在
        cur.execute("INSERT INTO locations_musiq1(location, location_title) VALUES (%s, %s)", (data.entries[i].title,data.entries[i].summary))
    psycopg2.IntegrityError:重复键值违反唯一约束“locations_musiq1_pkey”

任何人都可以有任何想法来解决这个问题吗?..提前谢谢..

4

3 回答 3

2

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

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

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

你想达到什么目的?

于 2010-03-10T10:41:25.347 回答
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))
于 2010-03-10T10:56:00.900 回答
1

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

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

请参阅有关系统列的文档。

于 2010-03-10T17:24:24.613 回答