python - MYsql 语句中的 python 2.7 变量替换问题
问题描述
感谢您的阅读。我对 SQL 有一些经验,对 python 很陌生。
在下面的代码中,我在 python 2.7 中访问 2 个数据库连接工作。我可以在一个语句中毫无问题地查询具有设备序列号的表。然后我想查询一个名称与另一个数据库中的序列号匹配的表,提取“Stamp”字段的最新值。当我明确地将表命名为 ccnbsc00000001 时,所有这些都有效,但是当使用变量替换时,它会失败。
当变量 currentdevice 被替换时,额外的字符被包括在内。当我打印该变量时,该输出中不存在这些字符。这是代码,底部的错误结果
#!/usr/bin/python
### Imports
import datetime
import mysql.connector
#Connect to heartbeat results database
hb_db = mysql.connector.connect(
host="localhost",
user="otheruser",
passwd="******",
database="active_devices"
)
#Connect to heartbeat results database
device_Settings_db = mysql.connector.connect(
host="localhost",
user="otheruser",
passwd="******",
database="active_devices"
)
device_settings_cursor = device_settings_db.cursor()
hb_cursor = hb_db.cursor()
## Get deviuce serial#
device_settings_cursor.execute('select device_serial from devices')
active_devices = device_settings_cursor.fetchall()
print ("these are the current devices:")
print (active_devices)
for device in active_devices:
currentdevice = device[0]
print(currentdevice)
print ("SELECT MAX(stamp) FROM (%s)" , (currentdevice,) )
hb_cursor.execute('SELECT MAX(stamp) FROM (%s)' , (currentdevice,) )
laststamp = hb_cursor.fetchone
laststamp = laststamp[0]
print("Last time stamp is:")
print(laststamp)
*
print(active_devices) [(u'ccnbsc00000001',), (u'ccnbsc00000002',)] 的输出
print(currentdevice) ccnbsc00000001 的输出(这是正确的输出/值)
但我在 SQL 查询中收到此错误,这意味着它保留了周围的字符 ' 和 ')
Traceback (most recent call last):
File "./hb_notify.py", line 61, in <module>
hb_cursor.execute('SELECT MAX(stamp) FROM (%s)' , (currentccn,) )
File "/usr/lib/python2.7/site-packages/mysql/connector/cursor.py", line 551, in execute
self._handle_result(self._connection.cmd_query(stmt))
File "/usr/lib/python2.7/site-packages/mysql/connector/connection.py", line 490, in cmd_query
result = self._handle_result(self._send_cmd(ServerCmd.QUERY, query))
File "/usr/lib/python2.7/site-packages/mysql/connector/connection.py", line 395, in _handle_result
raise errors.get_exception(packet)
mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your **SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''ccnbsc00000001')' at line 1**
解决方案
当您将字符串参数作为参数传递给 Python MySQL 库时,它们通常会插入引号,因为通常您确实需要这些引号。这就是您看到引号的原因。
此处的修复很简单:无需将这些值作为参数传递给光标,您只需将这些值直接插入到字符串中,就像它是任何其他 Python 字符串一样。像这样:
hb_cursor.execute('SELECT MAX(stamp) FROM {0}'.format(currentdevice))
Python 字符串参数将删除字符串周围的引号,MySQL 游标参数将保留引号。
推荐阅读
- bitmap - 在 MIPS 中绘制圆以位图显示
- python - 如何在 Python 中打印多个字符串中的多个变量
- javascript - ValueError:视图未返回 HttpResponse 对象。它返回 None 。(Django/ImgKit)
- c - C中的整数算术溢出预防
- android - Firebase 身份验证:在身份验证期间没有收到来自 FirebaseUser 的电子邮件
- html - 从 Vue 调用 laravel 路由
- c# - 如何按部分将 JSON 文件反序列化为 C# 对象
- php - 按钮和表格下拉列表显示 Laravel 8 中的重复值
- kubernetes-helm - helm 语法 {{ something }} 和 {{- something }} 有什么区别?
- sql - 雪花 Where 子句没有过滤?