Функция для построения строки запроса с использованием al oop возвращает только строку построения последних циклов - PullRequest
1 голос
/ 30 апреля 2020

У меня есть функция, которая будет использоваться для построения строки для 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(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'])

Это дает мне этот вывод как она печатает строку после второго l oop

SELECT a.v1, a.v2 FROM table1 as a UNION ALL
SELECT b.v1, b.v2 FROM table2 as b

Однако значение для «text» само возвращается из функции, если я просто напечатаю его

print(text)

is

SELECT b.v1, b.v2 FROM table2 as b

Это только последнее значение в l oop, поскольку оно перезаписывает значение для текста. Я просто не могу понять, как go через l oop и объединить текст с каждой итерацией, чтобы я получил возвращаемое значение, которое я хочу, которое является значением для текста =

"SELECT a.v1, a.v2 FROM table1 as a UNION ALL SELECT b.v1, b.v2 FROM table2 as b"

Спасибо

1 Ответ

2 голосов
/ 30 апреля 2020

Ваш код переопределяет text внутри l oop - поэтому будет возвращен только текст последних итераций цикла.

Вы можете немного очистить свой код и прийти к следующему:

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() - никакие промежуточные строки не нужно d ie для объединения строк таким образом .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...