我正在尝试使用Python将CSV文件导入PostgreSQL。我想告诉Python只导入CSV文件中不包含重复项的记录/行数据(只有第一个唯一的构建器记录)。我附上了我用来查找CSV文件中的重复项的代码。我是编程新手所以请原谅我的经验不足。
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"
答案 0 :(得分:2)
相反,使用COPY
(更快)将所有行导入临时表,然后使用{{1将INSERT
一个不同的集合导入到目标表中}或SELECT DISTINCT ...
或使用聚合函数)。发现欺骗是任何RDBMS的强项。
相关代码示例:
或,在逐行插入行 时,Postgres 9.5中的新UPSERT和所有5列上的SELECT DISTINCT ON (builder)
索引就是您所需要的:< / p>
但请注意UNIQUE
值的特殊作用(在SQL中从不被认为是相同的):
如果您需要识别专栏NULL
,只需定义该专栏builder
:
UNIQUE
并使用简单的UPSERT:
...
builder varchar(55) UNIQUE NOT NULL,
...
最好不要在Postgres btw中使用CaMelCase名称: