在Python中避免PostgreSQL数据库中的重复数据
-
19-09-2019 - |
题
我正在研究 PostgreSQL 和 psycopg2。试图获取10分钟后每次更新每次更新的供稿数据,并将其保存在PostgreSQL数据库中。我的目标是从该表中检索和打印这些数据。但面临问题,因为每次我运行该脚本时,由于对表进行插入操作,重复数据也存储在数据库中。
为了解决这个问题,我做了列的主键约束 location_title
在表中 Locations-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”更改为主键后出现的错误是:
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"
任何人都可以有任何想法来解决这个问题吗?..提前致谢..
解决方案
您可以尝试这样的事:
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))
其他提示
您的代码只有INSERT
,所以你觉得这是怎么回事,当你获取相同的数据是第二次发生?
您更新失败,因为你试图插入具有相同的字段值已经存在于具有唯一约束的列一个行。
您要么需要匹配从饲料到餐桌和INSERT,UPDATE项,酌情予以删除。在适当情况下通过进料数据和原因你同步定义。或者您清空表,并从进料,每次填充它。
什么是你想达到什么目的?
拉赫曼。您在评论中提出了第二个问题,该问题可能应该成为自己的问题。
无论如何,要按指定顺序返回结果,您需要 order by 子句。我在这里没有看到时间戳列,但我假设您的 Feed 数据采用 XML 格式。您可以通过一些 xpath 表达式进行排序。但如果您只想按插入顺序排列它们,则可以按隐藏系统列 xmin 排序,该列是插入操作的事务 id。
请参阅有关的文档 系统栏目.
不隶属于 StackOverflow