Psycopg2 - ข้อผิดพลาดการอนุญาต copy_expert ถูกปฏิเสธ

ฉันกำลังพยายามเปลี่ยนจาก Windows เป็น Ubuntu (ใช้ 12.04 LTS) และกำลังพยายามใช้สคริปต์เก่าบางส่วนเพื่อเรียกใช้ฐานข้อมูลเก่าของฉัน ก่อนหน้านี้ฉันใช้ postgresql และ psycopg2 เพื่อรักษามัน และฉันกำลังพยายามทำอีกครั้งที่นี่

ข้อผิดพลาดของฉันคือการนำเข้าไฟล์ CSV ไปยังตารางโดยใช้คำสั่ง Copy Expert

รหัสมีดังนี้:

#!/usr/bin/env python
import psycopg2 as psy
import sys

conn = psy.connect("dbname, user, host, password") # with the appropriate  values
curs = conn.cursor()

table = 'tablename' # a table with the appropriate columns etc
file = 'filename' # a csv file
SQL = "COPY %s FROM '%s' WITH CSV HEADERS" % (tablename, filename)

curs.copy_expert(SQL, sys.stdin) # Error occurs here

conn.commit()
curs.close()
conn.close()

ข้อผิดพลาดเฉพาะที่เกิดขึ้นมีดังนี้:

psycopg2.ProgrammingError: ไม่สามารถเปิดไฟล์ "ชื่อไฟล์" เพื่ออ่านได้: การอนุญาตถูกปฏิเสธ

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมอย่างมาก:

ฉันติดอยู่อย่างสมบูรณ์และเชื่อว่าเป็นเพราะความแปลกบางประการในการตั้งค่าฐานข้อมูลหรือไฟล์

การเพิ่มคำสั่งอ่านและพิมพ์อย่างง่ายโดยใช้โมดูล csv ก็ทำงานได้ดีเช่นกัน (จากสคริปต์เดียวกันในความเป็นจริง) มันจะส่งออกข้อมูลทั้งหมดจากไฟล์ csv จากนั้นเกิดข้อผิดพลาดโดยสิทธิ์ถูกปฏิเสธเมื่อพยายามนำเข้าไปยังฐานข้อมูล

import csv
f = open(filename, 'rb')
read = csv.reader(f, delimiter =',')
for row in read:
    print row
f.close()

person dantes_419    schedule 08.04.2012    source แหล่งที่มา
comment
คุณจำเป็นต้องรันสคริปต์โดยใช้ su เนื่องจากระบบการอนุญาตแตกต่างกันระหว่าง Ubuntu และ windows คุณมักจะจำเป็นต้องรันคำสั่งโดยใช้ sudo เว้นแต่คุณจะเป็นผู้ใช้รูท   -  person EdChum    schedule 08.04.2012
comment
เกิดข้อผิดพลาดเดียวกันเมื่อนำหน้าคำสั่งด้วย sudo ในกรณีนี้ฉันเป็นผู้ใช้รูท คุณช่วยอธิบายวิธีนำหน้าด้วย su หน่อยได้ไหม เช่นเดียวกับใน su python script.py?   -  person dantes_419    schedule 08.04.2012
comment
ใช่ด้วย su หรือ sudo แต่ดูเหมือนว่าจะใช้ไม่ได้เช่นกัน จะเกิดอะไรขึ้นหากคุณคัดลอกไฟล์ csv ไปยังเดสก์ท็อปหรือตำแหน่งอื่นที่คุณรู้แน่นอนว่าคุณมีสิทธิ์เต็มที่ในการทำสิ่งที่คุณต้องการกับไฟล์นั้น นอกจากนี้เส้นทางไปยังชื่อไฟล์คืออะไร อาจเป็นไปได้ว่าเส้นทางนั้นเข้ากันไม่ได้กับแบบแผน * nix เช่น เครื่องหมายทับ / แทนที่จะเป็น `\` แต่โดยปกติแล้ว python จะดูแลเรื่องนี้   -  person EdChum    schedule 09.04.2012
comment
สวัสดีเอ็ด การเพิ่มมันลงในโฮมไดเร็กตอรี่ดูเหมือนจะช่วยแก้ปัญหาได้ ไฟล์ถูกนำเข้าไปยังฐานข้อมูลได้สำเร็จ ฉันยังไม่แน่ใจอยู่นิดหน่อยว่าทำไม บางทีอาจเกี่ยวข้องกับการอนุญาตของ superusers ที่แตกต่างกัน? เช่น. postgres กับ ฉันเหรอ? ก่อนหน้านี้ฉันใช้ r/home/nigel/‹สองไดเร็กทอรี› ตอนนี้ใช้เพียง /home/nigel สคริปต์ก็ทำงานได้สำเร็จ   -  person dantes_419    schedule 09.04.2012
comment
ไม่แน่ใจว่าทำไมแต่บางไดเร็กทอรีถูกล็อคโดยค่าเริ่มต้น ดังนั้นคุณต้องเปลี่ยนผู้ใช้หรือเป็นผู้ใช้ขั้นสูงเสมอ อาจเป็นไปได้ว่าตำแหน่งนั้นยังไม่ขอบเขตสำหรับผู้ใช้ทั้งหมด บางทีก็ดีใจที่มันแยกแยะคุณออก จะโพสต์สรุปความคิดเห็นของฉันไว้เป็นคำตอบเพื่อให้คุณยอมรับได้   -  person EdChum    schedule 09.04.2012


คำตอบ (1)


ลองดำเนินการคำสั่งในฐานะผู้ใช้ขั้นสูงโดยใช้ su หรือ sudo และหากวิธีนี้ไม่ได้ผล ความเป็นไปได้อีกอย่างก็คือตำแหน่งของชื่อไฟล์นั้นอยู่นอกขอบเขต ดังนั้นฉันจะลองคัดลอกมันไปยังเดสก์ท็อปหรือโฮมไดเร็กตอรี่หรือโฟลเดอร์ของคุณ โดยที่คุณรู้ว่าคุณมีสิทธิ์เต็มรูปแบบอย่างแน่นอนและดูว่าวิธีนี้ใช้ได้ผลหรือไม่

person EdChum    schedule 08.04.2012
comment
ไชโย Ed การเพิ่มไฟล์ลงในโฟลเดอร์หลักช่วยแก้ปัญหาได้ - person dantes_419; 09.04.2012