2016-11-02 2 views
1

私はPythonを使用してPostgreSQLにCSVファイルをインポートしようとしています。私はPythonに、重複を含んでいないCSVファイル内のデータのレコード/行をインポートするように指示したい(最初の一意のビルダーレコードのみ)。私は、CSVファイルで重複を見つけるために使用しているコードを添付しています。私はプログラミングに慣れていないので、私の未熟さを赦してください。PostgreSQLに固有のレコードのみをインポートします

import csv 
import psycopg2 

database = psycopg2.connect (database = "***", user="***") 

cursor = database.cursor() 
delete = """Drop table if exists "Real".Noduplicates""" 
print (delete) 

mydata = cursor.execute(delete) 

cursor.execute("""Create Table "Real".Noduplicates 
      (UserName varchar(55), 
      LastUpdate timestamp, 
      Week date, 
      Builder varchar(55), 
      Traffic integer 
      );""") 

print "Table created successfully" 

csv_data = csv.reader(file('SampleData2.csv')) 

already_seen = set() 

next(csv_data) 

for row in csv_data: 
    builder = row[3] 
    if builder in already_seen: 
     print('{} is a duplicate builder'.format(builder)) 
    else: 
     print('{} is a new builder'.format(builder)) 
     already_seen.add(builder) 

for row in csv_data: 

    cursor.execute("""INSERT INTO "Real".Noduplicates (UserName, LastUpdate, Week, Builder, Traffic)"""\ 
        """VALUES (%s,%s,%s,%s,%s)""", 
      row) 

cursor.close() 
database.commit() 
database.close() 

print "CSV Imported" 
+1

を私はあなたのテーブルビルダーで変化するであろう

INSERT INTO "Real".noduplicates (userName, lastUpdate, week, builder, Traffic) VALUES (%s,%s,%s,%s,%s) ON CONFLICT ON (builder) DO NOTHING; 

ベター一意であること。つまり、データベースはこのキーへの複製をすべて拒否します。その後、データをループして、すべてのレコードを挿入し、失敗した場合は例外をキャッチしてください。データベースにあなたのための仕事をさせてください。 – Hannu

+0

@ハヌー:そうです。また、新しいUPSERT(INSERT ... ON CONFLICT ...)では、例外もありません。 –

答えて

2

代わりに、一時テーブルへのインポートすべての行)はSELECT DISTINCT ...又はSELECT DISTINCT ON (builder)を使用して、そこからターゲット表に(ずっと速く)COPY、次いでINSERT異なるセットを使用するか、集計関数を使用します。 dupesを見つけることは、あらゆるRDBMSの特色です。

関連コード例:

または、行ずつ、Postgresの9.5における新しいUPSERTと全てにUNIQUEインデックスを挿入しながら5列は必要なもの:

しかし、(SQLで等しいと見なされることはありません)NULL値の特別な役割注意:列builderはあなたが必要とするすべてである場合

をダブを特定するには、その列を定義するだけですUNIQUE

... 
builder varchar(55) UNIQUE NOT NULL, 
... 

とシンプルUPSERT使用:ところでPostgresの中にキャメルケースの名前を使用していない。:

+0

ありがとうございましたErwin、とにかく、最初のユニークなBuilderレコードをデータベースに送るようにPythonに指示することはできませんか?私はPythonで偽装を取り除きたい。 –

+0

@Pythoner:Pythonは、テーブルを調べずにどの行がテーブルに入っているかをどのように知っていますか? –

+0

データソースはCSVファイルです。独自のBuilderレコードをインポートしてからpostgreSQLに挿入するようにPythonに指示することは可能でしょうか? –

関連する問題