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

Python配列からPostgreSQLにすばやく変換するには?

    セットアップ

    に関連する回答で概説されているのと同じトリガー関数を使用して、トリガーを(繰り返し?)作成したいdba.SE 複数を作成するには、トリガー関数に値を渡す必要があります 複数の行 列の値、したがって2次元配列。 (ただし、任意ので作業できます 明確に定義された文字列!)

    PL / pgSQLトリガー関数に値を渡す唯一の方法(トリガー行の列値を除く)は、 textです。 0-として関数内でアクセス可能なパラメーター特別な配列変数TG_ARGV[]内のテキストのベース配列 。可変数のパラメーターを渡すことができますが、2次元配列を表す単一の文字列リテラルについては前に説明しました。

    入力は、符号付き整数の2次元Python配列から取得されます Postgresタイプのintegerに適合する数値。 。 Postgresタイプのbigintを使用します 符号なし整数をカバーするには、 asコメント

    Pythonでのテキスト表現は次のようになります:

    [[1,2],[3,4]]
    

    Postgres配列リテラルの構文:

    {{1,2},{3,4}}
    

    そして、あなたはプロセスを自動化したいのです。

    完全自動化

    CREATE TRIGGERの文字列を連結できます クライアントでステートメントを使用するか、サーバー側の関数でロジックを永続化して、パラメーターを渡すだけです。

    テーブル名とトリガー関数に渡される文字列を使用したサンプル関数のデモンストレーション。トリガー関数 insaft_function() dba.SEに関する以前の質問で定義されています 。

    CREATE OR REPLACE FUNCTION f_create_my_trigger(_tbl regclass, _arg0 text)
      RETURNS void
      LANGUAGE plpgsql AS
    $func$
    BEGIN
       EXECUTE format($$
          DROP TRIGGER IF EXISTS insaft_%1$s_ids ON %1$s;
          CREATE TRIGGER insaft_%1$s_ids
          AFTER INSERT ON %1$s
          FOR EACH ROW EXECUTE PROCEDURE insaft_function(%2$L)$$
                    , _tbl
                    , translate(_arg0, '[]', '{}')
          );
    END 
    $func$;
    

    電話:

    SELECT f_create_my_trigger('measurements', '[[1,2],[3,4]]');
    

    または:

    SELECT f_create_my_trigger('some_other_table', '{{5,6},{7,8}}');
    

    db <> fiddle こちら
    古い sqlfiddle

    これで、 [[1,2]、[3,4]]のいずれかを渡すことができます (角かっこ付き)または {{1,2}、{3,4}} (中括弧付き)。どちらも同じように機能します。 translate(_arg0、'[]'、'{}' 最初の形式を2番目の形式に変換します。

    この関数は、新しいトリガーを作成する前に、同じ名前のトリガーが存在する場合はそれをドロップします。この行を削除または保持することをお勧めします:

    DROP TRIGGER IF EXISTS insaft_%1$s_ids ON %1$s;
    

    これは、呼び出し元のDBロールの特権で実行されます。必要に応じて、スーパーユーザー(またはその他の)権限で実行することができます。参照:

    これを達成する方法はたくさんあります。正確な要件によって異なります。

    format()<の説明/ code>

    format() およびデータ型regclass DDLコマンドを安全に連結し、SQLインジェクションを不可能にするのに役立ちます。参照:

    最初の引数は「フォーマット文字列」であり、その後に文字列に埋め込まれる引数が続きます。 ドルの見積もり を使用しています 、これはこの例では厳密には必要ありませんが、通常、一重引用符を含む長い文字列を連結するための良いアイデアです: $$ DROP TRIGGER ... $$

    format() C関数sprintfに沿ってモデル化されています 。 %1 $ s format( ) 関数。これは、最初の( 1 $ )フォーマット文字列が引用符で囲まれていない文字列として挿入された後の引数 (%s )、したがって:%1 $ s 。フォーマットの最初の引数は_tblです。 例では-regclass パラメータは自動的に有効な識別子としてレンダリングされ、必要に応じて二重引用符で囲まれるため、 format() それ以上のことをする必要はありません。したがって、%s %Iではありません (識別子)。詳細については、上記のリンクされた回答をお読みください。
    使用されている他の形式指定子は、 %2 $ Lです。 引用符で囲まれた文字列リテラルとしての2番目の引数 。

    format()を初めて使用する場合 、理解するためにこれらの簡単な例で遊んでください:

    SELECT format('input -->|%s|<-- here', '[1,2]')
         , format('input -->|%s|<-- here', translate('[1,2]', '[]', '{}'))
         , format('input -->|%L|<-- here', translate('[1,2]', '[]', '{}'))
         , format('input -->|%I|<-- here', translate('[1,2]', '[]', '{}'));
    

    そして、マニュアルを読む




    1. このクエリを2つの内部結合で変更して、重複する結果が得られないようにするにはどうすればよいですか?

    2. MySQLデータ型:使用するデータ型とその方法を知っている

    3. rails postgresエラー:倍精度型の入力構文が無効です

    4. Ldap認証およびデータベースオーソリティへのSpringセキュリティスイッチ