sql >> Database >  >> RDS >> PostgreSQL

Python psql \kopieer CSV naar externe server

Probeer shell=True niet te gebruiken als je het kunt vermijden. het is beter om het commando zelf te tokeniseren om sh te helpen.

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

In dit geval zou uw kopieeropdracht kunnen zijn zoals het woordelijk aan psql wordt doorgegeven, omdat er geen shell is citaten om rekening mee te houden. (N.B. moet dit nog steeds citeren voor python, dus de string blijft zoals hij is).

Als je nog steeds shell=True . wilt gebruiken dan moet je ontsnappen aan de letterlijke tekenreeks voor zowel python en schelp

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

maakt een string in python die

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

Dat is wat we ontdekten dat we in de eerste plaats op onze schaal nodig hadden!

Bewerken (iets verduidelijkt uit de opmerkingen):

subprocess.call , als u shell=True niet gebruikt , neemt een iteratie van argumenten.

Dus je zou kunnen hebben

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)

Zie https://docs.python.org/2/library/ subprocess.html#subprocess.call of https://docs.python.org/3/library/ subprocess.html#subprocess.call

extra bewerking:- Houd er rekening mee dat om shell-injectie te voorkomen, u de hier beschreven methode moet gebruiken. Zie de waarschuwingssectie van https://docs.python. org/2/library/subprocess.html#frequently-used-arguments




  1. Hoe krijg ik toegang tot mysql buiten mijn kubernetes-cluster?

  2. Inleiding tot SQL-opdrachten

  3. Wat is de beste manier om gegevens tussen MS Access en MySQL te synchroniseren?

  4. Een karakter verwijderen van een bepaalde positie op Oracle