2010-12-09 40 views
1

我有一個SQL查詢,在Python中使用Psycopg2瘋狂。查詢從arches表中讀取一些列:Python,SQL:將列讀取爲參數

rows = archesDB.read_all("""SELECT "+str(columns)[1:-1].replace("'","")+" 
          FROM arches 
          WHERE lower(arch) like '%%%s%%'""" % (arch.lower())) 

我想這個參數化查詢,以便它不會指定使用字符串連接所需的列,但作爲參數 - 一個更優雅的方式。

天真的方法是SELECT *,並篩選出我需要的列。但是這會給DB和網絡帶來不必要的數據,所以我寧願避免它。

任何想法?

Adam

回答

2

列名不能作爲DB API中的參數在SQL字符串中傳遞。而且它也沒有意義。

如果您需要檢查列名輸入,請事先對其進行清理。

之類的字符串應該在好像

下面的代碼示例將是一個改善的參數,如果列變量包含列名的字符串列表:

rows = archesDB.read_all("""SELECT %s 
         FROM arches 
         WHERE lower(arch) like %%s""" % (",".join(columns),), 
         ("%%%s%%" % (arch.lower(),),)) 

首先,列名稱插入第一個替換(%s)中,最後一個%% s轉換爲%s。 然後(「%%% s %%」%(arch.lower(),),)生成一個帶有%string_content%的字符串。 最後,db api轉義%string_content%並向它添加引號,最終生成查詢。

0

您不能參數化元數據。創建一些標識符到所需字段列表的映射,並使用它。

+0

也就是說,使用`SELECT *`並過濾所需的列? – 2010-12-09 10:33:34