起因是要拼装一个insert语句,然后字段又特别多,超过了50个,于是写了一个简单的方法,传入一个对象,根据这个对象的类class,找出所有可公开访问的int、float、str变量名及变量值,合成一条insert语句。
def genInsertSqlByClass(obj: object, tableName: str)->str:
'''
传一个对象、需要插入的表名
:param obj: 对象
:param tableName: 表单名称
:return: 组装好的sql insert语句
'''
p1 = 'insert into `' + tableName + '`'
p2 = ''
p3 = ''
rlk = []
# 从对象obj中获取所有成员变量名
for i in obj.__dir__():
if i.find('_', 0, 1) == -1:
rlk.append(i)
# 遍历所有成员变量,如果值不是方法的,则加到sql语句中,注意这里只添加了int、float、str三种类型,如需识别date日期或时间还需再改进。
for k in range(len(rlk)):
v = obj.__getattribute__(rlk[k])
if callable(v) == False:
p2 = p2 + '`' + rlk[k] + '`'
if isinstance(v, int) or isinstance(v, float):
p3 = p3 + str(v)
elif isinstance(v, str):
p3 = p3 + '\'' + v.replace("'", "\\'") + '\''
p2 = p2 + ','
p3 = p3 + ','
# 去掉最后一个逗号
p2 = p2[:len(p2) - 1]
p3 = p3[:len(p3) - 1]
# 合成sql语句
sql = p1 + ' (' + p2 + ') values ' + '(' + p3 + ')'
print(sql)
return sql