gpt4 book ai didi

python - 仅将唯一记录导入 PostgreSQL

转载 作者:行者123 更新时间:2023-11-29 12:57:03 25 4
gpt4 key购买 nike

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

最佳答案

相反,使用COPY所有行 导入临时表(更快),然后INSERT 一个不同的集合到目标表中在那里,使用 SELECT DISTINCT ...SELECT DISTINCT ON (builder) 或使用聚合函数)。查找重复项是任何 RDBMS 的强项。

相关代码示例:

或者,在逐一插入行时,Postgres 9.5 中的新 UPSERT 和所有 5 列上的 UNIQUE 索引就是您的全部需要:

但请注意 NULL 值的特殊作用(在 SQL 中从不认为它们相等):

如果列 builder 是识别欺骗所需的全部内容,只需定义该列 UNIQUE:

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

并使用一个简单的 UPSERT:

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

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

关于python - 仅将唯一记录导入 PostgreSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40384607/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com