Я использую Postgresql 10, и мне нужно выполнить поиск в файле CSV и сравнить записи в файле CSV с записями в моей таблице postgres. База данных выглядит следующим образом, где я должен вставить имя домена в таблицу доменов и ранги в таблице рангов:
CREATE TABLE lists (list_id integer PRIMARY KEY,
list_name text);
CREATE TABLE domains (domain_id BIGSERIAL PRIMARY KEY,
domain_name text UNIQUE);
CREATE TABLE ranks (list_id integer REFERENCES lists,
domain_id integer REFERENCES domains,
rank integer,
date date,
PRIMARY KEY (list_id, rank, date));
CSV содержит две записи: ранг и имя домена, например: «1, google.com»
В настоящее время я вставляю имена доменов в таблицу доменов, где идентификатор домена автоматически увеличивается и служит первичным ключом. Затем я хочу вставить ранги в таблицу рангов. Но я изо всех сил пытаюсь получить domain_id из таблицы доменов в таблицу рангов, поскольку domain_id служит внешним ключом в таблице рангов. Поэтому я хочу проверить CSV для доменного имени, проверить его по таблице доменов и получить domain_id для каждого домена, когда я вставляю ранги. Таким образом, каждое доменное имя может иметь несколько рангов, это различается по дате.
Текущий скрипт, который я сейчас использую, выглядит следующим образом:
import tkinter as tk
from tkinter import filedialog
import csv
import psycopg2
import shutil as sh
root = tk.Tk()
root.withdraw()
file_path = filedialog.askopenfilename()
new_path = 'C:/Users/%user%/Desktop/alexa-top1m_16042018.csv'
conn = psycopg2.connect("host=localhost dbname=test user=postgres password=test")
cur = conn.cursor()
sh.copy2(file_path, new_path)
with open(new_path, 'r') as original: data = original.read()
with open(new_path, 'w') as modified: modified.write("rank,domain_name\n" + data)
with open(new_path, 'r') as f:
reader = csv.DictReader(f)
for row in reader:
cur.execute(
"""INSERT INTO ranks (list_id, rank, date) VALUES (%s, %s, %s);""", ( 1, row['rank'], '2018-04-16',)
)
conn.commit()
Я использую psycopg2 для подключения к БД и выполнения запросов.
Кто-нибудь знает, как это сделать, или есть какие-либо другие предложения о том, как этого добиться?