sql >> データベース >  >> RDS >> PostgreSQL

Python psql \copyCSVをリモートサーバーに

    shell=Trueを使用しないようにしてください あなたがそれを避けることができれば。自分でコマンドをトークン化して、shを支援することをお勧めします。

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

    この場合、 shell がないため、copyステートメントはpsqlにそのまま渡される可能性があります。 考慮すべき問題を引用する。 (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.callshell=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. SELECTのチェックサムはMySQLになります

    2. ORA-03115を取得:anonymous pl/sqlからvarcharの配列をフェッチ中にサポートされていないネットワークデータ型または表現エラー

    3. MySQLでIFステートメントを使用して、ストアドプロシージャなしで更新または挿入しますか?

    4. OracleおよびSQLServerの主キー