2014-03-07 120 views
0

我有Python代碼以下位:Python變量插入單引號

insert_table = settings.INSERT_TABLE_NAME 

     self.execute(
      """ 
      INSERT INTO `%(insert_table)s` 
      (time, rem_host, username, our_result, 
       upstream_result, reason, solution, difficulty) 
      VALUES 
      (FROM_UNIXTIME(%(time)s), %(host)s, 
       %(uname)s, 
       %(lres)s, 'N', %(reason)s, %(solution)s, %(difficulty)s) 
      """, 
      { 
       "insert_table": insert_table, 
       "time": v[4], 
       "host": v[6], 
       "uname": v[0], 
       "lres": v[5], 
       "reason": v[9], 
       "solution": v[2], 
       "difficulty": v[3] 
      } 
     ) 

我遇到的問題是,SQL查詢的結果包含圍繞「insert_table」變單引號等等結果是:

INSERT INTO `'my_table_name'` 

所以它顯然打破了查詢。

任何人有任何關於如何正確配置這個建議?

回答

1

您不能使用SQL參數來插入表名稱。您必須爲這些部分使用經典字符串格式。

這就是SQL參數的;它們會引用值,因此它們不可能被解釋爲SQL語句或對象名稱。

下工作,但你必須要小心,在你的表名來自:

""" 
INSERT INTO `{}` 
(time, rem_host, username, our_result, 
    upstream_result, reason, solution, difficulty) 
VALUES 
(FROM_UNIXTIME(%(time)s), %(host)s, 
    %(uname)s, 
    %(lres)s, 'N', %(reason)s, %(solution)s, %(difficulty)s) 
""".format(insert_table), 
{ 
    "time": v[4], 
    "host": v[6], 
    "uname": v[0], 
    "lres": v[5], 
    "reason": v[9], 
    "solution": v[2], 
    "difficulty": v[3] 
} 

如果insert_table爲用戶來源,最好的辦法是先審覈它針對的預先確定的列表現有表名。

+0

感謝您的支持!它的工作就像一個魅力。我並不擔心表名的來源,因爲它是硬編碼和安全的。不是從用戶輸入中得到的:) – Rabbie