Python / MySQL如何使用变量插入字符串,并将“ TRUE”更改为1

时间:2019-01-02 05:11:33

标签: python mysql

我有一个名为led_status的表和一个名为“ test_led”的字段:

mysql> describe led_status;
+------------------------------+------------+------+-----+---------+-------+
| Field                        | Type       | Null | Key | Default | Extra |
+------------------------------+------------+------+-----+---------+-------+
| test_led                     | varchar(5) | NO   |     | NULL    |       |
+------------------------------+------------+------+-----+---------+-------+

我正在尝试使用以下代码输入“ TRUE”或“ FALSE”(不是int 1或0)字符串:

def write_database_value(table,field,value):
    connect = mysql.connector.connect(user=db_info.username,
                              password=db_info.password,
                              host=db_info.servername,
                              database=db_info.database)
    cursor = connect.cursor()
    cursor.execute(("UPDATE %s SET %s = %s") % (table, field, value))
    connect.commit()
    cursor.close()
    connect.close()

def read_database_value(table,field):
    connect = mysql.connector.connect(user=db_info.username,
                              password=db_info.password,
                              host=db_info.servername,
                              database=db_info.database)
    cursor = connect.cursor(buffered=True)
    cursor.execute(("SELECT %s FROM %s") % (field, table))

    for data in cursor:
        database_value = data
        cursor.close()
    connect.close()
    return database_value

此脚本中调用了哪个

def get_led_status(led):
    led_status = read_database_value("led_status", led)
    led_status = (led_status[0])
    return led_status

def is_pool_pump_running():
    pool_running = get_led_status("test_led")
    if pool_running == "TRUE":
        print("Pool Pump is Running, shutting it off now")
        write_database_value("led_status","test_led","FALSE")
    else:
        print("Pool Pump is NOT Running, turning it on now")
        write_database_value("led_status","test_led","TRUE")

但是,每次我运行脚本时,它都会将“ TRUE”更改为1,将“ FALSE”更改为0。

我正在从平面文件切换到数据库,并且我所有的代码(到目前为止,其中4000行)都使用“ TRUE”和“ FALSE”,所以我真的不想只为了使用而重写它1和0,而不是“ TRUE”和“ FALSE”。

任何想法都将不胜感激。

3 个答案:

答案 0 :(得分:1)

MySQL没有布尔类型(true / false),它们会自动解释(并存储)为0/1(在上面的模式中,您甚至明确声明需要tinyints,而不是常规的32位int)。 Nothing you can do about that!

如果要存储文字值“ TRUE” /“ FALSE”,则应使用varchar(5)类型的列。

侧面说明:这些列的默认值应为0或1,或者应为可为空-您将其默认值设置为NULL且该列不可为空,这可能会导致错误。

答案 1 :(得分:0)

正如@frsechet答案指出的那样,在SQL中,您只有布尔值的0/1表示形式。如果需要TRUE / FALSE字符串,则需要将列类型更改为string / char(5)。

其他选项是,如果您使用通用函数来获取/更新列值,则可以在该函数内定义值映射,该映射将TRUE / FALSE转换为1/0,反之亦然。

答案 2 :(得分:0)

感谢所有提供输入的人。经过很多的挖掘,我发现了我的问题。显然,您无法在准备好的语句中参数化表名,而这正是我上面试图做的事情。 POST where I found the answer @Conspicuous编译器对该语句不满意。

问题出在我的write_database_value()函数中。这是可以根据需要运行的正确功能:

def write_database_value(table,column,value):
    try:
        connection = mysql.connector.connect(user=db_info.username,
                                      password=db_info.password,
                                      host=db_info.servername,
                                      database=db_info.database)
        cursor = connection.cursor(buffered=True)
        sql_update = "UPDATE " + table + " SET " + column + " = %s"
        cursor.execute(sql_update, (value,))
        connection.commit()
        cursor.close()
        connection.close()
    except Error as error :
        print("Failed to Update record in database: {}".format(error))
    finally:
        if(connection.is_connected()):
            connection.close

重大变化:

发件人: cursor.execute(("UPDATE %s SET %s = %s") % (table, field, value))

对此:

sql_update = "UPDATE " + table + " SET " + column + " = %s"
cursor.execute(sql_update, (value,))