#python #postgresql #psycopg2
#python #postgresql #psycopg2
Вопрос:
Я пытаюсь взять таблицу из базы данных postgres и скопировать содержимое этого csv в таблицу. Ошибка, которую я получаю, заключается в том, что psycopg2.error.SyntaxError: syntax error at or near "C"
я посмотрел на других людей, у которых была такая же ошибка, но проблема в том, что я уже попробовал то, что все предлагают, и я распечатываю свой путь, чтобы убедиться, что он правильный, и я скопировал и вставил этот график в файловый менеджер, и он открывает csv, поэтому я в замешательстве относительно проблемы.
path1 = r'C:UsersHankDocuments'
tb = 'test29'
path = os.path.join(path1,"Testing.csv")
print(f"This is the output path fro the csv {path}")
def csv_to_postgres():
sql = f"""COPY {tb} FROM {path} DELIMITER ',' CSV HEADER;"""
cur.execute(sql)
conn.commit()
print(f"Printing to {path} was successful.")
csv_to_postgres()
Я также пробовал string as "sql query {}".format(path)
и "sql query %s" path
, но ни один из трех не работает. Распечатанный путь был введен в функцию поиска Windows 10 и открывает CSV.
Благодаря комментарию мне также было показано, что я мог бы просто использовать, os.path.exists(path)
чтобы увидеть, существует ли путь, и он возвращает True
, поэтому я заблудился.
В дополнение к этому я смог заставить команду работать в pgAdmin, изменив права доступа к файлам для всех, но тот же точный код по-прежнему не выполняется в Python.
Комментарии:
1. На будущее, если вы не уверены в путях в своем коде, вместо того, чтобы печатать и вставлять его в поиск Windows, добавьте проверку os.path.exists (путь).
2. Не знал, что это существует, спасибо! К сожалению, это также возвращается
True
, поэтому я все так же потерян, потому что он сообщает мне, что он существует и не существует одновременно.
Ответ №1:
Приведенный ниже код является решением моей проблемы. В основном проблема заключалась в том, что мне сначала пришлось открыть CSV с помощью python, а затем использовать copy_expert
для его копирования. tb
это имя таблицы, которое, я полагаю, вам нужно STDIN
в запросе sql.
sql = f"""COPY {tb} FROM STDIN DELIMITER ',' CSV HEADER;"""
with open(path) as f:
cur.copy_expert(sql,f)
conn.commit()