2010-08-12 132 views
2

我有以下變量生成SQL語句的關鍵字儘量使自動生成SQL語句在Python蟒蛇給出列表

_SQL_fields   = ("ID", "NAME", "BIRTH", "SEX", "AGE") 
_add_SQL_desc_type = ("PRIMARY KEY AUTOINCREASEMENT",) 
_SQL_type   = ("INT",'TEXT') 
_Value    = (1,'TOM',19700101,'M',40) 

bop = ["AND"] * (len(_SQL_fields) - 1) 
mop = ["="] * 5 
comma = [","] * 4 

exception_field = ["NAME", "BIRTH"] 

成功設計一個SQL語句,我需要低於上述變量生成的字符串:

'(ID, NAME, BIRTH, SEX, AGE)' 
'(ID PRIMARY KEY AUTOINCREASEMENT INT, NAME TEXT, BIRTH, SEX, AGE)' 
'ID = 1 AND NAME = "TOM" AND BIRTH = "19700101" AND SEX = "M" AND AGE = '40'' 

除去exception_field串可以看起來像

'(ID, SEX, AGE)' 
'(ID PRIMARY KEY AUTOINCREASEMENT INT, SEX, AGE)' 
'ID = 1 AND SEX = "M" AND AGE = '40'' 

= =========

到目前爲止,我使用類似

str(zip(_SQL_fields,_add_SQL_desc_type,_SQL_type,comma)) 

或使用

", ".join(_SQL_fields) 

得到一個。

但是,當處理「逗號」和「引號」時尤其如此。

'(ID, NAME, BIRTH, SEX, AGE)' <===== this is OK for SQL 
'(ID, NAME, BIRTH, SEX, AGE,)' <===== this is NOT 

'ID = 1 AND NAME = "TOM" AND BIRTH = "19700101" AND SEX = "M" and AGE = '40' 
        ^-some var need quotes and some do no need them. 

因此,任何人可以分享我怎麼寫乾淨的代碼生成上述字符串?

謝謝你的時間!

KC

+0

你是否按照你所擁有的方式將變量綁定在變量上,還是在你的控制之下? – aaronasterling 2010-08-12 10:17:50

+0

謝謝,這些字段和其他變量都在控制之下,但我希望它更加靈活,同時很多strA + strB + strC方式可能看起來太複雜。 坦率地說,以簡單的方式,我可以直接將它傳遞給SQL查詢,但可以這樣寫:'ID = 1 AND NAME =「TOM」AND BIRTH =「19700101」AND SEX =「M」AND AGE ='40''不是我想要的,我希望系統可以通過靜態或動態方式給物流生成SQL。 – 2010-08-12 10:24:08

+2

我強烈建議你看看ORM。我使用SQLAlchemy一段時間,發現它令人滿意。我目前正在玩弄你想要的東西,我可以說這是具有挑戰性的。這種方式存在元類,描述符和各種黑魔法。 – aaronasterling 2010-08-12 10:41:47

回答

0

爲了獲得

'(ID PRIMARY KEY AUTOINCREASEMENT INT, NAME TEXT, BIRTH, SEX, AGE)' 

你可以在Python中使用izip_longest從itertools模塊裏。

然後,要移除獲取列表中的exception_fields,可以使用set或list理解。

l1 = [1, 2, 3, 4] 
l2 = [2, 3] 
l3 = list(set(l1) - set(l2)) 
print l3 
--> [1, 4] 

l3 = [val for val in l1 if val not in l2] 
print l3 
--> [1, 4] 

我推薦列表理解。

", ".join(_SQL_fields) 

是完美的獲得

'ID, NAME, BIRTH, SEX, AGE' 

,所以我真的不明白你的問題。

+0

感謝ohe。我的問題現在可以通過ORM:SQLAlchemy解決。 – 2010-08-13 02:31:47