Python 函数使用循环生成查询字符串,只返回最后一个循环生成字符串
我有一个函数,用于为sql查询构建字符串Python 函数使用循环生成查询字符串,只返回最后一个循环生成字符串,python,python-3.x,function,text,Python,Python 3.x,Function,Text,我有一个函数,用于为sql查询构建字符串 def create_text(tablelist=None, fieldlist=None): alphalist = [] alpha = 'a' for i in range(0, len(tablelist)): alphalist.append(alpha) alpha = chr(ord(alpha) + 1) for i,v in enumerate(alphalist): if i + 1 == len(a
def create_text(tablelist=None, fieldlist=None):
alphalist = []
alpha = 'a'
for i in range(0, len(tablelist)):
alphalist.append(alpha)
alpha = chr(ord(alpha) + 1)
for i,v in enumerate(alphalist):
if i + 1 == len(alphalist):
last=True
else:
last=False
y=str(v)
text ="SELECT "+', '.join([y+ '.' +x for x in fieldlist]) + ' FROM ' \
+str(tablelist[i]) + " as " + str(y)
if not last:
text = text + " UNION ALL"
print(text)
return text
我这样称呼它
text = create_text(tablelist = ['table1', 'table2'], fieldlist = ['v1','v2'])
它在第二个循环后打印字符串时给我这个输出
SELECT a.v1, a.v2 FROM table1 as a UNION ALL
SELECT b.v1, b.v2 FROM table2 as b
但是,“text”本身的值是从函数返回的,如果我只是打印它的话
print(text)
是
这只是循环中的最后一个值,因为它覆盖了文本的值。我只是不知道如何通过循环并在每次迭代中连接文本,以便得到我想要的返回值,这是文本的值=
"SELECT a.v1, a.v2 FROM table1 as a UNION ALL SELECT b.v1, b.v2 FROM table2 as b"
谢谢您的代码在循环中重新定义了
文本
,因此只会返回最后的循环迭代文本
您可以对代码进行大量清理,并得出以下结论:
def create_text(tablelist=None, fieldlist=None):
# collects parts to be str.joined later
parts = []
# iterate the tablenames directly
for i, table in enumerate(tablelist):
# no neeed to precompute, simply use i to get a new alias
alias = chr(ord('a')+i)
# string interpolation style formating for bonus points
fields = ', '.join( f"{alias}.{x}" for x in fieldlist)
# collect in list
parts.append( f"SELECT {fields} FROM {table} as {alias}")
# returned joined list
return " UNION ALL\n".join(parts)
text = create_text(tablelist = ['table1', 'table2'], fieldlist = ['v1','v2'])
print(text)
得到
SELECT a.v1, a.v2 FROM table1 as a UNION ALL
SELECT b.v1, b.v2 FROM table2 as b
每次需要连接文本时,将它们收集到一个列表中,然后使用str.join()
-这样连接字符串不需要中间字符串
SELECT a.v1, a.v2 FROM table1 as a UNION ALL
SELECT b.v1, b.v2 FROM table2 as b