Как скопировать csv-файл в postgresql с помощью команды копировать?

#python-3.x #postgresql #csv #database-connection #pg

Вопрос:

Я написал следующий сценарий для загрузки csv-файла в базу данных postgresql.

 import psycopg2
import keys
con = psycopg2.connect(
            host = keys.keys['host'],
            database = keys.keys['database'],
            user = keys.keys['user'],
            password = keys.keys['password'])

#cursor 
cur = con.cursor()

#execute query
#Already created ___#cur.execute("CREATE TABLE accounts (user_id serial PRIMARY KEY, username VARCHAR ( 50 ) UNIQUE NOT NULL, password VARCHAR ( 50 ) NOT NULL, email VARCHAR ( 255 ) UNIQUE NOT NULL, created_on TIMESTAMP NOT NULL, last_login TIMESTAMP)")

cur.execute("""COPY "MyData" FROM 'C:FILESTestData.csv' DELIMITER ',' CSV HEADER;""")

#commit the transcation 
con.commit()

#close the cursor
cur.close()

#close the connection
con.close()
 

Но он вернул следующую ошибку:-

 SyntaxError: syntax error at or near ""
LINE 1:  COPY "MyData" FROM 'C:FILESTestData.csv' DELIMITER ',' C...
 

Я не являюсь пользователем root, поэтому я не мог напрямую использовать COPY команду.

Ответ №1:

Хорошо.

Вы можете использовать psycopg2 copy_from -> >https://www.psycopg.org/docs/cursor.html#cursor.copy_from

Таким образом, ваш код будет выглядеть примерно так:

 import psycopg2
import keys
con = psycopg2.connect(
            host = keys.keys['host'],
            database = keys.keys['database'],
            user = keys.keys['user'],
            password = keys.keys['password'])

#cursor 
cur = con.cursor()

#execute query
#Already created ___#cur.execute("CREATE TABLE accounts (user_id serial PRIMARY KEY, username VARCHAR ( 50 ) UNIQUE NOT NULL, password VARCHAR ( 50 ) NOT NULL, email VARCHAR ( 255 ) UNIQUE NOT NULL, created_on TIMESTAMP NOT NULL, last_login TIMESTAMP)")


with open('C:\Files\TestData.csv', 'r') as acc:
    next(acc) # This will skip the header
    cur.copy_from(acc, 'accounts', sep=',')

#commit the transcation 
con.commit()

#close the cursor
cur.close()

#close the connection
con.close()


 

Надеюсь, это ответ на ваш вопрос.