sql >> Databasteknik >  >> RDS >> PostgreSQL

Python psql \copy CSV till fjärrserver

Försök att inte använda shell=True om du kan undvika det. bättre att symbolisera kommandot själv för att hjälpa sh.

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

I det här fallet kan din kopia-sats vara så som den skickas till psql ordagrant, eftersom det inte finns något skal citatfrågor att ta hänsyn till. (Obs. måste fortfarande citera detta för python, så strängen skulle förbli som den är).

Om du fortfarande vill använda shell=True då måste du undkomma strängen literal för både python och skal

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

kommer att skapa en sträng i python som kommer att vara

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

Vilket är vad vi fick reda på att vi behövde på vårt skal i första hand!

Redigera (förtydligar något från kommentarerna):

subprocess.call , när du inte använder shell=True , tar en iterabel av argument.

Så du kunde ha

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)

Se https://docs.python.org/2/library/ subprocess.html#subprocess.call eller https://docs.python.org/3/library/ subprocess.html#subprocess.call

extra edit:- Observera att för att undvika skalinjektion bör du använda metoden som beskrivs här. Se varningsavsnittet i https://docs.python. org/2/library/subprocess.html#frequently-used-arguments




  1. Vilka är konsekvenserna av att öppna MySQL-anslutningar om och om igen i PHP

  2. PayPal IPN uppdaterar inte MySQL-databas

  3. Få bild från MySQL till tableWidget i PyQt5

  4. Hur kan jag göra två villkor i att ha klausul