Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python/MySQL如何使用变量插入字符串,不断将“TRUE”更改为1_Python_Mysql - Fatal编程技术网

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

Python/MySQL如何使用变量插入字符串,不断将“TRUE”更改为1,python,mysql,Python,Mysql,我有一个名为led_status的表和一个名为test_led的字段: mysql> describe led_status; +------------------------------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------------------------

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

mysql> describe led_status;
+------------------------------+------------+------+-----+---------+-------+
| Field                        | Type       | Null | Key | Default | Extra |
+------------------------------+------------+------+-----+---------+-------+
| test_led                     | varchar(5) | NO   |     | NULL    |       |
+------------------------------+------------+------+-----+---------+-------+
我正在尝试输入一个字符串,该字符串不是int 1或0,而是TRUE或FALSE,代码如下:

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


任何想法都将不胜感激

MySQL没有布尔类型true/false,它们在上面的模式中被自动解释并存储为0/1,您甚至清楚地声明您想要的是tinyint,而不是常规的32位int

如果要存储文本值TRUE/FALSE,则应使用varchar5类型的列


旁注:这些列的默认值应该是0或1,或者可以为NULL-您已经将它们的默认值设置为NULL,并且该列不可以为NULL,这可能会导致错误。

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


另一个选项是,如果使用公共函数获取/更新列值,则可以在该函数内定义值映射,该函数将TRUE/FALSE转换为1/0,反之亦然

感谢所有提供意见的人。经过反复研究,我发现了我的问题。显然,您不能在准备好的语句中参数化表名,这正是我在上面尝试做的@我完全同意那句话

问题出在我的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.executeUPDATE%s集%s=%s%表、字段、值

为此:

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

两件重要的事情:1您没有在SQL上使用%字符串格式,这会导致SQL注入漏洞2分割数据及其表示:0/1或Python中的False/True是用于在计算机中存储和处理的数据,字符串True和False是您向人类显示数据的方式。谢谢@klauds。我的理解是%s是正确的方法,cursor.execute专门防止SQL注入问题。在堆栈交换上,我指出了这个方向。这个信息不正确吗?第二,正如我上面所说的,我正在从一个使用真/假表示的平面文件移动,我真的不想在移动到数据库设计时将所有代码重写为0/1,因此,我希望使用true/false作为varchar,而不是0/1作为bit或tinyint。为了安全起见,它必须是逗号。啊!!!我想错了%!我会读更多关于这方面的内容,并对其进行更改。我正在使用varchar5!如果你看我上面的表格,测试led是varchar5型。@Richard在我写答案的时候你不是。它显示在你的文章的修订版中…实际上,测试指示灯总是一个varchar5。它仍然不起作用。def get_led_status led:led_status=read_database_valueled_status,led_status=led_status[0]返回led_status抱歉,不确定注释中的代码格式:-我使用的是varchar5!如果你看我上面的表格,测试led是varchar5类型。今天早上当我阅读你的代码时,我100%想说,这是你自己弄明白的道具。正如我在回答中的链接中提到的,无论大小写转换为1,都是真的。您的查询是UPDATE led_status SET TRUE,它被读取为1,而不是字符串TRUE,因为它没有用引号括起来。从led_状态选择测试_led将帮助您更快地调试。旁注:建议使用预处理语句,而不是在查询中插入字符串,这是出于安全原因,也是出于您在这里遇到的原因。例如:如果有人按照1的行写了一些东西,而不是真的,该怎么办;删除数据库;。。。