仅导入PostgreUnique记录

2024-09-28 23:46:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用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"

Tags: 文件csvexecutedatabuilderdeleterealcursor
1条回答
网友
1楼 · 发布于 2024-09-28 23:46:39

相反,使用COPY(速度更快)将所有行导入到临时表中,然后使用SELECT DISTINCT ...SELECT DISTINCT ON (builder)或使用聚合函数,INSERT将所有行导入临时表。查找副本是任何RDBMS的长处。在

相关代码示例:

,在逐个插入行时,Postgres 9.5中的新UPSERT和所有5列的UNIQUE索引就是您所需要的:

但是请注意NULL值的特殊作用(在SQL中,这些值从来没有被认为是相等的):

如果列builder是标识重复项所需的全部内容,只需定义该列UNIQUE

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

并使用简单的UPSERT:

^{pr2}$

最好不要在Postgres中使用CaMelCase名称顺便说一句:

相关问题 更多 >