PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Python psql \ sao chép CSV vào máy chủ từ xa

Cố gắng không sử dụng shell=True nếu bạn có thể tránh nó. tốt hơn nên tự mã hóa lệnh để giúp sh.

subprocess.call(["psql", "-U", "{user}", "-h", "{ip}", "-d", "{db}", "-w", "{pw}", "-c", "{copy statement}"])

Trong trường hợp này, câu lệnh sao chép của bạn có thể giống như nó được chuyển đến nguyên văn psql, vì không có shell trích dẫn các vấn đề cần tính đến. (N.B. vẫn phải trích dẫn điều này cho python, vì vậy chuỗi sẽ vẫn như cũ).

Nếu bạn vẫn muốn sử dụng shell=True thì bạn phải thoát khỏi chuỗi theo nghĩa đen cho cả python vỏ

"\"\copy table (col1, col2) FROM file_location CSV HEADER QUOTE '\\\"' NULL ''\""

sẽ tạo một chuỗi trong python sẽ là

"\copy table (col1, col2) FROM file_location CSV HEADER QUOTE '\"' NULL ''\"

Đó là những gì chúng tôi phát hiện ra rằng chúng tôi cần trên shell của mình ngay từ đầu!

Chỉnh sửa (làm rõ điều gì đó từ các nhận xét) :

subprocess.call , khi không sử dụng shell=True , có một đối số có thể lặp lại.

Vì vậy, bạn có thể có

psql_command = "\"\copy table (col1, col2) FROM file_location CSV HEADER QUOTE '\\\"' NULL ''\""
# user, hostname, password, dbname all defined elsewhere above.
command = ["psql",
    "-U", user,
    "-h", hostname,
    "-d", dbname,
    "-w", password,
    "-c", psql_command,
]

subprocess.call(command)

Xem https://docs.python.org/2/library/ subprocess.html # subprocess.call hoặc https://docs.python.org/3/library/ subprocess.html # subprocess.call

chỉnh sửa bổ sung:- Xin lưu ý rằng để tránh tiêm vỏ, bạn nên sử dụng phương pháp được mô tả ở đây. Xem phần cảnh báo của https://docs.python. org / 2 / library / subprocess.html # thường-dùng-đối số




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách tạo số thứ tự trong PostgreSQL

  2. Lưu trữ dữ liệu được mã hóa trong Postgres

  3. THAM GIA TRÁI trong PostgreSQL là gì

  4. Đã xảy ra lỗi khi cài đặt pg (0.17.1) và Bundler không thể tiếp tục

  5. Rails - Sử dụng phép nối với các liên kết được đặt tên tùy chỉnh