Mysqldb为一个非Nu列返回Null

2024-06-08 21:30:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个脚本,它应该在决定做其他工作之前,通过另一个脚本检查数据库中的状态字段。我们有多种类似类型的设备,每种类型都有自己的表。这个脚本正在检查这三种不同的设备类型,并正在访问我为数据库函数创建的模块。当第一个设备类型运行时,一切都很好,但是接下来的两个返回Null,结果是None,因为这是python。这三个函数的代码都是一样的,我只是将设备名和类型提交给函数。我让它打印它使用的sql查询,如果我直接在sql中运行它,它就会工作。我还让它选择整行,而不仅仅是单个列,所有其他列返回正确,但其中一列仍然为空。我检查了数据库结构,除了设备类型之外,其他类型的列数不同,它们基本上是相同的,特别是这个列在表中是相同的。我有另一个几乎相同的函数,它拉一个不同的列,这个函数可以跨所有表工作。此列上的数据类型是text,我尝试了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

对于一种类型的设备,两种打印都能正常工作,对于另一种,我在两个地方都没有。 数据库是RedHat 7.4上的MariaDB 5.5.56

(来自评论)

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'

Tags: 函数脚本ci数据库类型sqldevicetype