psycopg: не могу скопировать из csv в postgresql с python, без результатов
У меня есть простой postgresql DB с OID. Количество столбцов и их имена аналогичны заголовкам в файле CSV. Я пытаюсь использовать команду копирования:
def db_copy_images(self, file):
my_file = open(file)
try:
self.process_file('images_original', my_file)
finally:
pass
def process_file(self, table, csv_file):
dbname = 'v'
user = 'on'
password = 'on'
host = 'ip'
port = 5432
SQL_STATEMENT = """COPY %s FROM STDIN WITH DELIMITER AS '|' CSV HEADER"""
print ("OK")
conn = psycopg2.connect(database=dbname,user=user,password=password,host=host,port=port)
cursor = conn.cursor()
for line in csv_file:
print(line)
#cursor.copy_expert(sql = SQL_STATEMENT % table, file = csv_file)
cursor.copy_expert("COPY images_original FROM STDIN WITH DELIMITER AS '|' CSV HEADER", file = csv_file)
cursor.execute("COMMIT;")
Я получил список строк в качестве вывода, и тогда мой процесс завершается. Но нет никаких изменений в базе данных и нет ошибок. Как я могу отладить это? Вот мой след
manager_db.py(63): cursor.copy_expert("COPY images_original FROM STDOUT WITH DELIMITER AS '|' CSV HEADER", file = csv_file)
manager_db.py(66): cursor.execute("COMMIT;")
manager_db.py(68): conn.commit
manager_db.py(69): cursor.close
manager_db.py(70): conn.close
manager_db.py(36): pass
--- modulename: trace, funcname: _unsettrace
trace.py(80): sys.settrace(None)
вот моя БД создать:
CREATE TABLE images_original
(
"image id" integer NOT NULL,
"file url" character varying NOT NULL,
"file format id" integer,
"file format" character varying,
"file width" integer,
"file height" integer,
"file quality factor" integer,
"file bit depth" integer,
"file margin" integer,
"file bg color" integer,
"file size" integer,
"scaling factor" character varying,
delta character varying
)
WITH (
OIDS=TRUE
);
ALTER TABLE images_original
OWNER TO on;
и первые строки в моем тестовом файле:
image id|file url|file format id|file format|file width|file height|file quality factor|file bit depth|file margin|file bg color|file size|scaling factor|delta
172317239|http://cps-static.r.com/2/Open/NBC/The%20Office/Steve%20Carell%204.jpg|0||2336|3504|||||949406||INS
172317239|http://cps-static.r.com/2/Open/NBC/The%20Office/_derived_jpg_q90_0x200_m0/Steve%20Carell%204.jpg|1391886|jpg|133|200|90|24|0|24|6624|5.69|INS
172317239|http://cps-static.r.com/2/Open/NBC/The%20Office/_derived_jpg_q90_155x235_m0/Steve%20Carell%204.jpg|1391887|jpg|155|232|90|24|0|24|8092|6.64|INS
1 ответ
Спасибо за обновление вопроса. Немного необычно иметь пробелы в именах столбцов, хотя не невозможно. Я попытался ввести вашу строку копирования прямо из командной строки PSQL. Это сработало. Потом это выскочило на меня:
for line in csv_file:
print(line)
csv_file.seek(0)
Когда вы печатаете данные из файла, вы перемещаете указатель файла. seek(0) сбрасывает его в начало. Эта команда должна работать, если вы добавляете поиск или просто удаляете цикл, который печатает содержимое файла.
-г