如何在mysqldb中存储和查询十六进制值

时间:2018-04-03 09:58:11

标签: python python-2.7 raspberry-pi raspberry-pi3 escpos

我想使用带有覆盆子pi的热敏打印机。我想从mysql数据库接收打印机供应商ID和产品ID。我的列的类型为varchar

我的代码是

import MySQLdb
from escpos.printer import Usb
db= MySQLdb.connect(host=HOST, port=PORT,user=USER, passwd=PASSWORD, db=database)
cursor = db.cursor()
sql = ("select * from printerdetails")
cursor.execute(sql)
result = cursor.fetchall()
db.close()
for row in result:
    printer_vendor_id = row[2]
    printer_product_id = row[3]
    input_end_point = row[4]
    output_end_point = row[5]
print printer_vendor_id,printer_product_id,input_end_point,output_end_point
Printer = Usb(printer_vendor_id,printer_product_id,0,input_end_point,output_end_point)
Printer.text("Hello World")
Printer.cut()

但它不起作用。 id是字符串。 print命令显示0x154f 0x0517 0x82 0x02.in my case

Printer = Usb(0x154f,0x0517,0,0x82,0x02)

工作正常。如何将相同的ID存储到数据库并使用它们来配置打印机

1 个答案:

答案 0 :(得分:1)

您的问题是,您对Usb的调用期望整数,如果您这样称呼它就会有效

Printer = Usb(0x154f,0x0517,0,0x82,0x02)

但是您的数据库调用返回存储为字符串的十六进制值的元组。所以你需要将这些字符串转换为整数,如下所示:

for row in result:
    printer_vendor_id = int(row[2],16)
    printer_product_id = int(row[3],16)
    input_end_point = int(row[4],16)
    output_end_point = int(row[5],16)

现在,如果你这样做

print printer_vendor_id,printer_product_id,input_end_point,output_end_point

你会得到

(5455, 1303, 130, 2)

可能看起来不对,但不是,您可以通过要求以十六进制格式显示整数来检查:

print ','.join('0x{0:04x}'.format(i) for i in (printer_vendor_id,printer_product_id,input_end_point,output_end_point))

0x154f,0x0517,0x0082,0x0002

我应该指出,这只能起作用,因为您的数据库表只包含一行。 for row in result遍历表中的所有行,但恰好只有一行,这没关系。如果还有更多,那么您的代码将始终获取表的最后一行,因为它不会检查行的标识符,因此会重复地将值分配给相同的变量,直到它用完数据。

解决这个问题的方法是在SQL where语句中添加select子句。像

这样的东西
"select * from printerdetails where id = '{0}'".format(printer_id)

现在,因为我不知道您的数据库表是什么样的,所以列名id几乎肯定是错误的。而且很可能是数据类型:它可能不是一个字符串。