繁体   English   中英

mysql语句中的python 2.7变量替换问题

[英]python 2.7 variable substitution issue in MYsql statement

感谢您的阅读。 我有一些SQL的经验,这是python的新手。

在下面的代码中,我正在python 2.7中访问2个数据库。 我可以在一条语句中查询没有序列号的设备表。 然后,我想查询一个表,该表的名称与另一个数据库中的序列号匹配,以提取“戳记”字段的最新值。 当我将表明确命名为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)


*

打印输出(active_devices)[[u'ccnbsc00000001',),(u'ccnbsc00000002',)]

打印输出(当前设备)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游标参数将保留引号。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM