Я строю список переменных, которые будут вставлены в строку, которая выполняется в запросе jaydebeapi sql. У меня есть список имен пользователей, и мне нужно добавить к ним домен. Я немного озадачен выводом этих данных и хотел уточнить, как это работает.
def build_query():
emp_list = ['user1', 'user2', 'user3']
ms = [f"MS\\{ids}" for ids in emp_list]
s = ""
c = 0
for ele in ms:
c += 1
if c != len(ms):
s += f"'{ele}', "
else:
s += f"'{ele}'"
correct_query = f"""
Select *
from T
where user in ({s})
"""
incorrect_query = f"""
Select *
from T
where user in {str(tuple(ms))}
"""
return [correct_query, incorrect_query]
print(build_query()[0], '\n', build_query()[1])
правильный запрос - это то, что я собираюсь сделать, печатает
Select *
from T
where user in ('MS\user1', 'MS\user2', 'MS\user3')
и неправильный выводит
Select *
from T
where user in ('MS\\user1', 'MS\\user2', 'MS\\user3')
Я читал много ответов на подобные вопросы, говоря, что Python печатает двойную обратную косую черту sh, даже если она на самом деле хранится как одна обратная слабая сторона sh ( по доверенности метода repr
). Это не согласуется с запросом, который я строю, хотя. Когда первый правильный запрос передается в jaydebeapi, он выполняет и возвращает ожидаемые значения, но второй неправильный запрос возвращает пустой набор, потому что база данных не содержит данных с двойным backsla sh.
Мой вопрос, по сути, заключается в том, что на самом деле здесь происходит, и есть ли лучший способ получить ожидаемый результат, который не предполагает превращения моего списка в одну строку, как я делал ниже? Если python на самом деле хранит один sla sh, то почему этот проходящий запрос обрабатывается как двойной backsla sh?