import psycopg2
import time
def read_database():
conn = None
try:
conn = psycopg2.connect(database = "capitadb", user = "capita_user", password = "capita_user",
host = "127.0.0.1", port = "5432")
cur = conn.cursor()
start_time = time.time()
cur.execute("COPY stagging(Activity_ID,F_Qtr,Fiscal_Week_Num,Manager,MBadge) FROM '/home/vivek/Downloads/dell_data.csv' DELIMITER',' CSV;;")
print("--- %s seconds ---" % (time.time() - start_time))
print("Operation done successfully")
conn.commit()
except Exception as e:
print("Error: %s" % e)
finally:
conn.close()
if __name__ == '__main__':
read_database()
Здесь у нас 15 столбцов в CSV-файле, но мы хотим скопировать только 4 столбца. Как этого добиться, не извлекая данные из какого-либо файла?
Вам нужно будет использовать функциональность COPY FROM STDIN
- http://initd.org/psycopg/docs/cursor.html#cursor.copy_from. Вы сможете предоставить этой функции объект в виде файла. Вы можете использовать для этого модуль itertools
from itertools import chain, islice
class some_magic_adaptor(object):
def __init__(self, src):
self.src = chain.from_iterable(src)
def read(self, n):
return "".join(islice(self.src, None, n))
def read_csv():
for line in open(csv_filename):
yield transform_line(line)
file_like_object_for_postgresql = some_magic_adaptor(read_csv())
Обновил ответ. Вам нужно будет реализовать функцию transform_line
Но возможно ли это с помощью команды копирования postgres, а не stdio, потому что мой объем данных слишком велик, например, 20 ГБ?