我有一个名为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”。
任何想法都将不胜感激。
答案 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,))