【问题标题】:python generate SQL statement keywords by given listspython通过给定列表生成SQL语句关键字
【发布时间】:2010-08-12 10:12:17
【问题描述】:

我有以下变量尝试在 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

【问题讨论】:

  • 你是按照你拥有变量的方式绑定变量,还是在你的控制之下?
  • 谢谢,这些字段和其他变量都在控制之下,但我希望它更灵活,而且很多 strA + strB + strC 方式可能看起来太复杂了。坦率地说,我可以用简单的方式写 'ID = 1 AND NAME = "TOM" AND BIRTH = "19700101" AND SEX = "M" AND AGE = '40'' 然后直接将其传递给 SQL 查询,但那是不是我想要的,我希望系统可以通过静态或动态方式给物流生成SQL。
  • 我强烈建议您查看 ORM。我使用了一段时间的 SQLAlchemy,发现它令人满意。我目前正在玩你所要求的东西,我可以说这很有挑战性。那就是元类、描述符和各种黑魔法。
  • 我以前读过 ORM 模块,但发现它们可能不会将数据存储为计划数据库表,而且它们可能很重。我会继续努力,谢谢!
  • 问题是你写的任何东西都可能很重,或者最终会像普通 SQL 一样不方便使用并且不易维护。有大量的极端案例。

标签: python sql list keyword


【解决方案1】:

获得

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

您可以在 python 的 itertools 模块中使用izip_longest

然后,要删除获取列表中的异常字段,您可以使用集合或列表推导。

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'

所以我真的不明白你的问题。

【讨论】:

  • 谢谢哦。我的问题可以通过 ORM 解决:SQLAlchemy now。
猜你喜欢
  • 2021-12-03
  • 2010-09-06
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
  • 2020-11-23
  • 1970-01-01
相关资源
最近更新 更多