Работа с булевыми значениями MySQL в python - PullRequest
2 голосов
/ 01 марта 2009

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

* 1003 Е.Г. *

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 ]

2 голосов
/ 02 марта 2009

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

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

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

И функция Bool2Str:

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

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

2 голосов
/ 01 марта 2009

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

2 голосов
/ 01 марта 2009

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

value = {'False' : False, 'True' : True}[data]
2 голосов
/ 01 марта 2009

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

0 голосов
/ 17 мая 2017

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

Пример:

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

if not ord(data):
    print("False")
0 голосов
/ 28 января 2013

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

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

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

if data == b'\x01':
  print('Success')
else:
  print('Fail')
0 голосов
/ 01 марта 2009

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

Если вы используете 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"

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

...