обратные слеши в python строках - PullRequest
0 голосов
/ 02 апреля 2020

Я строю список переменных, которые будут вставлены в строку, которая выполняется в запросе 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?

...