[英]Python: automated change in variable contents
我有一個Python函數,該函數接收大量變量,並根據它們構建一個SQL查詢:
def myfunc(name=None, abbr=None, grade=None, ...)
這些值應建立一個SQL查詢。 為此,這些誰等於None
應更改為NULL
,和那些誰保存有用的值應該與擁抱'
S:
name="'"+name+"\'" if name else 'NULL'
abbr="'"+abbr+"\'" if abbr else 'NULL'
...
Lots of lines here - that's my problem!
...
然后,
query="""INSERT INTO table(name, abbr, ...)
VALUES (%(name)s, %(abbr)s, ...) """ locals()
cur.execute(query)
是否有更好的,更Python化的方法來根據此規則更改變量內容?
亞當
形成SQL查詢的最佳方法不是通過字符串格式設置- cursor
對象的execute
方法采用帶有占位符和序列(或dict,具體取決於您對DB API的確切實現)的查詢字符串,並帶有在那里替代的價值; 然后它將執行所需的從無到空和字符串引用。
我強烈建議您研究這種可能性。 但是,如果出於其他目的需要字符串處理,則可以執行以下操作:
processed = dict((n, "'%s'" % v if v is not None else 'NULL')
for n, v in locals().iteritems())
然后使用字典processed
而不是locals()
進行進一步的字符串格式化。
您可以如下定義myfunc
:
def myfunc(*args, **kwargs)
其中kwargs是一個字典,其中包含所有傳遞給函數的命名參數。
要獲取查詢參數的值,可以使用kwargs.get(name_of_parameter, 'NULL')
。 要構建查詢,您只需遍歷所有字典項。 但是請注意,如果以此方式進行操作,則任何作為命名參數傳遞給函數的參數都將最終出現在查詢中。
將參數傳遞給psycopg2的正確方法是使用占位符,並讓驅動程序處理這些值 。 沒有一個將自動轉換為NULL,並且執行了正確的字符串轉義。
連接字符串不是一個好主意 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.