Работа с логическими значениями MySQL в Python

Я запрашиваю базу данных MySQL в python и выбираю логическое значение, поэтому ответ MySQL представляет собой строку «True» или «False». Я хотел бы выполнить дополнительный код на основе логического значения из MySQL.

Например

data = 'False'  # assume this is what was returned by MySQL.
if data:
  print 'Success'  #really this would be where I would execute other if True.
else:
  print 'Fail'  #really this would be where I would execute other code if False

Но я не могу этого сделать, потому что

if data:

всегда будет возвращать True

Итак, как мне преобразовать строку, которую MySQL возвращает, в логическое значение в python?

На данный момент у меня есть:

data = 'False'  # assume this is what was returned by MySQL.
if data == 'True':
  print 'Success'
else:
  print 'Fail'

Я считаю, что должен быть лучший способ сделать это в python - вероятно, мне не хватает чего-то простого.

Ответов (7)

Это обрабатывает способ, которым он возвращается MySQLdb.

if data == '\x01':
  print 'Success'
else:
  print 'Fail'

Проверено, что это работает для Python 3.6

if data == b'\x01':
  print('Success')
else:
  print('Fail')

Вы можете использовать ord which return целое число, представляющее Unicode.

Пример:

if ord(data):
    print("True")

if not ord(data):
    print("False")

Ваше решение на самом деле вполне нормальное, но есть альтернативы:

Если вы используете Python 2.5 или выше, вы можете сократить оператор if:

print 'Success' if data == 'True' else 'Fail'

Если вы часто повторяете проверку, вы можете подумать о написании для нее функции, чтобы сделать ее более читаемой:

def is_true(mysql_boolean):
    if mysql_boolean == "True":
        return True
    else:
        return False

# now you can use this:
if is_true(data):
    # this is really going to be more than one line of code anyway.
    # or maybe a function call, in which your solution might be enough.
    print "Success"
else:
    print "Fail"

Вы можете добиться того же со словарем, но я не считаю это элегантным:

mysql_bool = {'True': True, 'False': False}

if mysql_bool[data]:
    print "Success"

Тем не менее, что вы используете для подключения к БД? Вероятно, есть способ напрямую получить оттуда bool. Пожалуйста, обновите свой вопрос!

Логическое значение в MySQL - TINYINT (1). Проверка на 1 или 0 может сработать

Если ваше соединение с базой данных не знает, как преобразовать значения для вас, вам нужно использовать лучший вариант. Это не должно быть чем-то, что вам нужно делать самому. Если это не фактические логические значения, а просто столбец типа int, в котором вы храните только 0 или 1, тогда вам следует исправить свою схему. В качестве альтернативы, если вы всегда получаете значения «Истина» и «Ложь», возможно, вы случайно конвертируете их где-то в строку?

Если столбец всегда является одной из фактических строк "False" или "True" (в отличие от целых чисел или чего-то еще), я бы порекомендовал несколько вариантов:

value = {'False' : False, 'True' : True}[data]

Вы можете найти место, где MySQLDdb преобразует значения в файле converters.py в каталоге MySQLdb.

вот фрагмент, имеющий дело с bool:

conversions = {
    ...
    types.BooleanType: Bool2Str,
    ...
}

И функция Bool2Str:

def Bool2Str(s, d): return str(int(s))

Если вам нужно другое поведение, импортируйте словарь конверсий и измените его.