PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Python psql \copy CSV на отдалечен сървър

Опитайте се да не използвате shell=True ако можете да го избегнете. по-добре сами да токенизирате командата, за да помогнете на sh.

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

В този случай тогава вашият оператор за копиране може да бъде такъв, какъвто се предава на psql дословно, защото няма shell проблеми с цитирането, които трябва да се вземат предвид. (N.B. все още трябва да цитирам това за python, така че низът ще остане такъв, какъвто е).

Ако все пак искате да използвате shell=True тогава трябва да екранирате низовия литерал както за python и обвивка

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

ще създаде низ в python, който ще бъде

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

Което открихме, че се нуждаем на първо място в нашата обвивка!

Редактиране (изяснявам нещо от коментарите):

subprocess.call , когато не използвате shell=True , приема повторение на аргументи.

Така че бихте могли да имате

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)

Вижте https://docs.python.org/2/library/ subprocess.html#subprocess.call или https://docs.python.org/3/library/ subprocess.html#subprocess.call

допълнителна редакция :- Моля, обърнете внимание, че за да избегнете инжектиране на черупка, трябва да използвате метода, описан тук. Вижте раздела за предупреждения на https://docs.python. org/2/library/subprocess.html#frequently-used-arguments




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Съхраняване на вложени хешове в PostgreSQL с Rails 4 (и Hstore)

  2. Данни за пари в PostgreSQL с помощта на Java

  3. Часова зона на заявката - db сървърът и клиентската машина имат различни часови зони

  4. Локална грешка на Postgres

  5. Запитване за персонализиран параметър postgresql с оператор SELECT