通过给定列表生成Python SQL语句关键词

2 投票
1 回答
652 浏览
提问于 2025-04-16 02:41

我有一些变量,想用它们在Python里自动生成SQL语句。

_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

1 个回答

0

要获取

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

你可以使用 Python 中 itertools 模块里的 izip_longest

接着,为了从获取的列表中去掉 exception_fields,你可以使用集合(set)或者列表推导式(list comprehension)。

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'

所以我其实不太明白你的问题。

撰写回答