sql >> Database teknologi >  >> RDS >> PostgreSQL

Python psql \copy CSV til fjernserver

Prøv ikke at bruge shell=True hvis du kan undgå det. bedre at tokenize kommandoen selv for at hjælpe sh.

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

I dette tilfælde kan din kopierklæring være, som den er overført til psql ordret, fordi der ikke er nogen shell citatproblemer at tage hensyn til. (NB skal stadig citere dette for python, så strengen forbliver som den er).

Hvis du stadig vil bruge shell=True så skal du undslippe strengen literal for både python og skal

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

vil oprette en streng i python, som vil være

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

Hvilket er, hvad vi fandt ud af, at vi havde brug for på vores shell i første omgang!

Rediger (forklarer noget fra kommentarerne):

subprocess.call , når du ikke bruger shell=True , tager en gentagelse af argumenter.

Så du kunne have

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

ekstra redigering:- Bemærk venligst, at for at undgå skalinjektion, skal du bruge metoden beskrevet her. Se advarselsafsnittet på https://docs.python. org/2/library/subprocess.html#frequently-used-arguments




  1. MySQL-tabel med fast antal rækker?

  2. Sådan finder du medianen i sql

  3. Hvordan bruger man case-when i Ecto Queries i eliksir?

  4. adjacency model, givet et id returnerer bladknuderne