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

sqlalchemyで返すことで生のクエリを実行する方法

    Postgresのおもちゃのテーブルでこれを試しましたが、動作します。Oracleでも同等のはずです。教えてください。

    In [15]:
    
    result = session.connection().execute("insert into usertable values('m6', 'kk2', 'Chile') returning username")
    for r in result:
        print r
    (u'm6',)
    

    お役に立てば幸いです。

    Oracle用に編集 :私が見つけたそれを行う1つの方法は、あまりエレガントではありません。 SQLAlchemyの下の生の接続を使用します 接続、次のようなもの:

    In [15]:
    
    from sqlalchemy.sql import text
    import cx_Oracle
    ​
    cur = session.connection().connection.cursor()
    out = cur.var(cx_Oracle.STRING)
    par = { "u" : out }   ​
    cur.prepare("insert into usertable values('m34', 'kk2', 'Chile') returning username into :u")
    cur.execute(None, par)
    ​
    print(out)
    print(type(out))
    print(out.getvalue())
    ​
    ​
    <cx_Oracle.STRING with value 'm34'>
    <type 'cx_Oracle.STRING'>
    m34
    

    残念ながら、cx_oracle variableを作成する方法はないと思います。 たとえば、APIでは使用できません。docs

    その場合、SQLAlchemyにさらに委任したときにカーソルが機能したとしても、カーソルの作成を回避する方法はありません。 :

    In [28]:
    
    from sqlalchemy.sql import text
    import cx_Oracle
    ​
    cur = session.connection().connection.cursor()
    out = cur.var(cx_Oracle.STRING)
    par = { "u" : out }
    ​
    q = text("insert into usertable values('m43', 'kk2', 'Chile') returning username into :u")
    result = session.connection().execute(q, par)
    print(par["u"])
    print(out)
    type(out)
    
    ​<cx_Oracle.STRING with value 'm43'>
    <cx_Oracle.STRING with value 'm43'>
    Out[28]:
    cx_Oracle.STRING
    

    もちろん、この2番目のケースではカーソルを閉じる必要があります(最初のケースでは、oracleがカーソルを閉じます)。 out = cx_Oracle.STRING()のようなインスタンスを作成する方法がないという点

    私が言っているように、それはあまりエレガントではありませんが、SQLAlchemyで同等の変数を作成する方法はないと思います 。これは、コードが内部で処理するものです。生の接続カーソルを選択します。

    お役に立てば幸いです。

    編集2 :上記のコードで、out.getvalue()を追加しました 提案されたように。ありがとう!



    1. Doctrine TEXTタイプを取得する方法は?

    2. 特殊文字を含むURLを開くために必要なこと

    3. .NETのOraOLEDBプロバイダーはCLOBフィールドに依存しませんか?

    4. find_by_sqlエイリアスを使用していたとき、混乱しました