2015-03-02 53 views
2

我想將csv文件導入psql數據庫。在閱讀了關於COPY\copy之間的差異之後,我在執行腳本時遇到了此錯誤。如何在Python中使用psql「 copy」?

這裏是我的代碼切割:

try: 

    csv_data = os.path.realpath('test.csv') 

    con = psycopg2.connect(database = 'db01', user = 'postgres') 
    cur = con.cursor() 

    cur.execute("\copy stamm_data from '%s' DELIMITER ';' csv header" % csv_data) 

    con.commit() 

而這裏的錯誤:

Error: syntax error at or near "\" 
LINE 1: \copy stamm_data from '/home/jw/dev/test.csv' delimiter ';' ... 
    ^

當使用COPY我得到:

Error: could not open file "/home/jw/dev/test.csv" for reading: Permission denied 

雖然PSQL用戶Postgres的是超級用戶和運行該腳本的ubuntu用戶對test.csv文件具有讀取權限。

任何想法?

+2

'\ copy'用於psql命令行工具。 python有[copy_from](http://initd.org/psycopg/docs/cursor.html#cursor.copy_from)和copy_to。 – 2015-03-02 12:45:10

+0

謝謝!我不知道psycopg2提供了這樣的功能。還有一個問題:當我使用'copy_from'時,我不能像psql命令中那樣忽略csv-header,我是對的?對我來說最好的解決方案是從csv-data中刪除第一行(頭文件),然後用'copy_from'導入文件? – jwi 2015-03-02 15:27:35

+0

是的,要麼或看到'copy_expert'而不是'copy_from' – 2015-03-02 15:45:18

回答

1

好的,這裏我們去..解決方案與copy_from工作正常 - 我從csv文件中刪除標題並導入該文件與copy_from

但現在我遇到了以下錯誤:

Error: null value in column "id" violates not-null constraint 
DETAIL: Failing row contains (null, foo01, ACE001, 3). 

我的表有以下幾列:

ID, hotelcode, hotelname, stars 

ID是我PK,所以我不能刪除NOT NULL修飾符。如何導入每行的ID?或者我該如何說Postgres填充值爲'DEFAULT'的列ID,以便數據庫自己生成ID?

+0

我自己找到解決方案:只需將表格中的列ID從INT更改爲SERIAL即可 - 工作良好。乾杯! – jwi 2015-03-03 13:23:31

+1

如果有一個默認設置int應該已經工作。也很高興看到工作代碼。 – Jasen 2017-03-15 21:05:32