Mysqldb возвращает Null для одного столбца, который не является Null - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть сценарий, который должен проверять поле состояния в базе данных другим сценарием, прежде чем решиться выполнить какую-либо другую работу. У нас есть несколько похожих типов устройств, и у каждого типа есть своя таблица. Этот скрипт проверяет три из этих различных типов устройств и обращается к модулю, который я создал для функций базы данных. Когда запускается первый тип устройства, все работает отлично, но следующие два возвращают Null, что соответствует None, поскольку это python. Код одинаков для всех трех, я просто отправляю имя и тип устройства в функцию. У меня было распечатать SQL-запрос, который он использует, и он работает, если я запускаю его непосредственно в SQL. Я также сделал так, чтобы он выделил всю строку вместо одного столбца, и все остальные столбцы вернулись правильно, но этот один столбец все еще пуст. Я проверил структуру базы данных и, кроме типов устройств, имеет разное количество столбцов, они по существу идентичны, и этот столбец, в частности, одинаков для разных таблиц. У меня есть другая почти идентичная функция, которая извлекает другой столбец и работает для всех таблиц. Тип данных в этом столбце - текст, и я попробовал varchar и получил те же результаты.

Функция базы данных:

def getStatus(self, target, type):
    sql = 'SELECT `status` FROM `' + type + 's` WHERE `' + type + 'id` = \'' + target + '\''
    cursor = self.data_base.cursor()
    try:
        test = cursor.execute(sql)
        data = cursor.fetchone()
        print data[0]
        return data[0]
    except Exception as e:
        print "Error: " + str(e)

Основной сценарий (общая версия, оба одинаковы, за исключением разных типов устройств):

for device in devices:

    ip = db.getIp(device, "device type")
    status = db.getStatus(device, 'device type')
    print status

Для одного типа устройства оба отпечатка работают правильно, для другого я получаю None в обоих местах. База данных MariaDB 5.5.56 на RedHat 7.4

(из комментария)

CREATE TABLE vgws (
    vgwid varchar(16) COLLATE utf8_unicode_ci NOT NULL, 
    ip varchar(15) COLLATE utf8_unicode_ci NOT NULL, 
    siteid varchar(8) COLLATE utf8_unicode_ci NOT NULL, 
    vendor varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL, 
    version varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL, 
    status text COLLATE utf8_unicode_ci, 
    PRIMARY KEY (vgwid), 
    UNIQUE KEY ip (ip)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

Сгенерированный запрос

SELECT status FROM vgws WHERE vgwid = 'DEVICE NAME'
...