2016-02-20 32 views
1

我試圖找到一種方法來插入一個值到我的Sqlite查詢選擇一列。Python的Sqlite轉義字符串選擇列

我現在工作的是;

def ChangeItemQuantity(self, item_name, incrament_quantity): 
    try: 
     # Change given item quantity in database 
     self.c.execute(''' 
      SELECT quantity 
      FROM items 
      WHERE itemName=? 
      ''',(item_name,)) 
     current_quantity = self.c.fetchone() 
     new_quantity = current_quantity[0] + incrament_quantity 
     self.c.execute(''' 
      UPDATE items 
      SET quantity = ? 
      WHERE itemName=? 
      ''',(new_quantity, item_name)) 
     self.conn.commit() 

這適用於在quantity列更改的值,但我想重新使用此方法在另一列也,alertLevel更改值。

所以我想傳遞列名稱,像這樣;

def ChangeItemQuantity(self, column_name, item_name, incrament_quantity): 
    try: 
     self.c.execute(''' 
      SELECT ? 
      FROM items 
      WHERE itemName=? 
      ''',(column_name, item_name)) 

我也試過了;

 self.c.execute(''' 
      SELECT {} 
      FROM items 
      WHERE itemName={} 
      '''.format(column_name, item_name)) 

謝謝你的一切幫助。

回答

1

無法參數化列名或表名。你必須使用字符串格式化:

def ChangeItemQuantity(self, column_name, item_name, incrament_quantity): 
    try: 
     self.c.execute(''' 
      SELECT {column_name} 
      FROM items 
      WHERE itemName=? 
      '''.format(column_name=column_name), (item_name,)) 

確保雖然你要麼相信你的來源,或者插入查詢之前驗證列名。

+0

不好意思,但這與我試過的'.format'有什麼不同呢? – JohnBoy

+0

@JohnBoy它不同。您必須使用列或表格名稱的格式,但查詢的其餘部分仍應參數化。 – alecxe

+0

好的,謝謝!這裏使用的'.format()'是否容易受到SQL注入? – JohnBoy