2016-11-30 7 views
1

いくつかの未加工SQLを実行し、SQLAlchemyのSQLインジェクション防止を利用したいと思います。SQLAlchemyでの入力パラメータの設定raw SQL

私のコードは、このビットに似ています

import sqlalchemy 
from sqlalchemy.sql import text 

DB_URI = '...' 
engine = sqlalchemy.create_engine(DB_URI) 

sql = text("SELECT * FROM some_table WHERE userid = :userid") 
res = engine.execute(sql, userid=12345) 
# do something with the result... 

問題がsome_tableuseridはタイプvarcharであるということです。私がしたいのは、ステートメントを実行する前に12345を文字列に変換するようにSQLAlchemyに指示することだけです。私はPythonとSQLの両方でどのように変換を行うことができるかを知っています。しかし、私はかつてSQLAlchemyで明示的な型定義を使用していたことを覚えています。私はこれ以上見つけられません。誰かが私に正しい方向を向けることができますか? (私の実際の質問には、BIGINTとINTのpostgresql配列が含まれていますが、単純なままにしました)

ありがとうございました!

答えて

1

質問はもう少し古いですが、自分自身を知っているので、今後これで復帰する予定です。 これは私が探していたコードのビットだった:うん

import sqlalchemy 
from sqlalchemy.sql.expression import bindparam 
from sqlalchemy.types import String 
from sqlalchemy.dialects.postgresql import ARRAY 

DB_URI = '...' 
engine = sqlalchemy.create_engine(DB_URI) 

sql = text("SELECT * FROM some_table WHERE userid = :userid").bindparams(bindparam("userid", String)) 
res = engine.execute(sql, userid=12345) 

# in particular this bit is useful when you have a list of ids 
sql = text("SELECT * FROM some_table WHERE userids = :userids").bindparams(bindparam("userids", ARRAY(String))) 
res = engine.execute(sql, userids=[12345, 12346, 12347]) 
0

私が見たものから、私は何が不足しておりません場合は、それを行うには「当たり前」方法の2種類があります -

第一の道

userid=12345 # defining here 
sql = text("SELECT * FROM some_table WHERE userid = '"+userid+"'") 
res = engine.execute(sql) 

第二の道

sql = text("SELECT * FROM some_table WHERE userid = :userid") 
res = engine.execute(sql, userid=str(12345)) 
+0

- 私は(明示的にSQLでの鋳造型の方法もあります)...これらの両方を知っていました。しかし、私の問題は、BIGINTの配列と比較したいpostgresqlの整数配列があることです。私はsqlalchemyに型があることを知っているので、text()コマンドの型を明示的に設定する方法があることを覚えているようです。 (btw。第1の方法は 'userid =" '; DROP TABLE some_table; - ) ' – asPlankBridge

+0

のため、これらの詳細を含む質問を編集してください。ソリューションを絞り込むことは非常に難しく、私たちはただ推測することに終わります –

関連する問題