我想使用带有Raspberry 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是字符串。打印命令显示0x154f 0x0517 0x82 0x02.在我的情况下
Printer = Usb(0x154f,0x0517,0,0x82,0x02)
工作正常。我如何将同一ID存储到数据库中,并使用它们来配置打印机
您的问题是您对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
循环遍历桌子中的所有行,但恰好只有一个行,这是可以的。如果还有更多内容,您的代码将始终获取表的最后一行,因为它不会检查行的标识符,因此会反复将值分配给相同的变量,直到它运行到数据。
修复方法是将where
子句放在SQL select
语句中。像
"select * from printerdetails where id = '{0}'".format(printer_id)
现在,因为我不知道您的数据库表是什么样子,所以列名称id
几乎肯定是错误的。而且很可能数据类型:它很可能不是字符串。