仅将唯一记录导入 PostgreSQL
Import only unique records into PostgreSQL
我正在尝试使用 Python 将 CSV 文件导入 PostgreSQL。我想告诉 Python 只导入 CSV 文件中不包含重复项的 records/rows 数据(仅第一个唯一的构建器记录)。我附上了我用来在 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
(快得多)将 所有行 导入临时 table,然后 INSERT
将不同的集合导入从那里定位 table,使用 SELECT DISTINCT ...
或 SELECT DISTINCT ON (builder)
或使用聚合函数)。查找重复项是任何 RDBMS 的强项。
相关代码示例:
- How to update selected rows with values from a CSV file in Postgres?
- Check if records exists in a Postgres table
或,同时插入行 逐行 ,Postgres 9.5 中的新 UPSERT 和一个 UNIQUE
索引您只需要 5 列即可:
但请注意 NULL
值的特殊作用(在 SQL 中从不认为它们相等):
- Allow null in unique column
如果 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 名称。:
- Are PostgreSQL column names case-sensitive?
我正在尝试使用 Python 将 CSV 文件导入 PostgreSQL。我想告诉 Python 只导入 CSV 文件中不包含重复项的 records/rows 数据(仅第一个唯一的构建器记录)。我附上了我用来在 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
(快得多)将 所有行 导入临时 table,然后 INSERT
将不同的集合导入从那里定位 table,使用 SELECT DISTINCT ...
或 SELECT DISTINCT ON (builder)
或使用聚合函数)。查找重复项是任何 RDBMS 的强项。
相关代码示例:
- How to update selected rows with values from a CSV file in Postgres?
- Check if records exists in a Postgres table
或,同时插入行 逐行 ,Postgres 9.5 中的新 UPSERT 和一个 UNIQUE
索引您只需要 5 列即可:
但请注意 NULL
值的特殊作用(在 SQL 中从不认为它们相等):
- Allow null in unique column
如果 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 名称。:
- Are PostgreSQL column names case-sensitive?