【发布时间】: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 一样不方便使用并且不易维护。有大量的极端案例。