2016-11-30 71 views
1

我想執行一些原始SQL並利用SQLAlchemy的SQL注入預防功能。在SQLAlchemy原始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... 

的問題是,在useridsome_table類型varchar的。我所要做的就是告訴SQLAlchemy在執行語句之前將12345轉換爲字符串。我知道如何在Python和SQL中進行轉換。但是我記得我曾經在SQLAlchemy中使用過顯式的類型定義,我再也找不到它了。有人能指引我走向正確的方向嗎? (我的實際問題涉及BIGINTs與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

從我看到,有兩個這樣的「咄」的方式來做到這一點,如果我不缺任何東西 -

1路

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明確類型轉換的方式)。但我的問題是,我有一個整數的postgresql數組,我想與一個BIGINT數組進行比較。我知道在sqlalchemy中有類型,我似乎記得有一種明確設置text()命令類型的方法。 (順便說一句,第一種方法是一個壞主意,因爲'userid =''; DROP TABLE some_table; - 「') – asPlankBridge

+0

你能編輯一個問題來包含這些細節嗎?要縮小解決方案的範圍非常困難,我們最終只會猜測一些東西 –