2

私は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」を主キーとして変更した後の私のエラーは次のとおりです。

    トレースバック (最新の呼び出しが最後):
      ファイル「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ません。同じデータを 2 回目にフェッチするとどうなると思いますか?

一意の制約を持つ列に既に存在するフィールド値と同じフィールド値を持つ行を挿入しようとしているため、更新は失敗しています。

フィードからテーブルへのエントリを一致させ、必要に応じて INSERT、UPDATE、DELETE する必要があります。必要に応じて、フィード データと同期の理由によって定義されます。または、テーブルを空にして、毎回フィードから入力します。

何を達成しようとしていますか?

于 2010-03-10T10:41:25.347 に答える
1

ラーマン。コメントで 2 番目の質問をしていますが、これはおそらく独自の質問にする必要があります。

とにかく、指定された順序で結果を返すには、order by 句が必要です。ここにはタイムスタンプ列はありませんが、フィード データは XML でフォーマットされていると思います。いくつかの xpath 式で注文できます。ただし、挿入された順序でそれらを並べたい場合は、挿入操作のトランザクション ID である非表示のシステム列 xmin で並べ替えることができます。

システム列に関するドキュメントを参照してください。

于 2010-03-10T17:24:24.613 に答える