Python SQL 当我用变量替换硬编码值时查询 returns "ORA-00936: missing expression"
Python SQL query returns "ORA-00936: missing expression" when I replace hard-coded value with variable
我有一个充满信息的数据库,我正在尝试编写一个 python 脚本来提取一些数据并将其组织到报告中。这是我目前所拥有的:
import cx_Oracle
import pandas as pd
conn = cx_Oracle.connect('REDACTED')
cursor = conn.cursor()
# Currently hard-coded to return single known motor number
cursor.execute('SELECT MOTORID FROM MOTORS WHERE SERIALNUM=804')
# Returns [(11)]
lMotorID = cursor.fetchall()
# Query Assessments for list of how long the motor had run when assessment was taken
cursor.execute("SELECT DISTINCT RUNHOURS FROM ASSESSMENTS WHERE MOTORID = %s \
ORDER BY RUNHOURS" % lMotorID[0])
# Returns [(0), (0.91), (8), (25), ...]
lHours = cursor.fetchall()
# Query for number of installed sensors by senor type
cursor.execute("SELECT SENSTYP, COUNT(STATUS) FROM HEALTH LEFT JOIN INSTRUMENTATION \
ON HEALTH.INSTROID = INSTRUMENTATION.INSTROID LEFT JOIN ASSESSMENTS \
ON HEALTH.ASSESSID = ASSESSMENTS.ASSESSID WHERE ASSESSMENTS.ASSESSID \
IN (SELECT ASSESSID FROM ASSESSMENTS WHERE MOTORID = 11 AND RUNHOURS = %s) \
GROUP BY SENSTYP ORDER BY SENSTYP" % lHours[2])
# Returns a 2-column dataframe with sensor type in column 0 and the total in column 1
dfTotal = pd.DataFrame(cursor.fetchall())
因为我希望它适用于任何电机,所以我想用一个变量替换硬编码的 MOTORID = 11
。我尝试用这个替换最后一个查询:
cursor.execute("SELECT SENSTYP, COUNT(STATUS) FROM HEALTH LEFT JOIN INSTRUMENTATION \
ON HEALTH.INSTROID = INSTRUMENTATION.INSTROID LEFT JOIN ASSESSMENTS \
ON HEALTH.ASSESSID = ASSESSMENTS.ASSESSID WHERE ASSESSMENTS.ASSESSID \
IN (SELECT ASSESSID FROM ASSESSMENTS WHERE MOTORID = %s AND RUNHOURS = %s) \
GROUP BY SENSTYP ORDER BY SENSTYP" % (lMotorID[0], lHours[2]))
dfTotal = pd.DataFrame(cursor.fetchall())
那是我收到 ORA-00936 错误的时候。我不明白为什么查询是用硬编码值完成的,但当该值被变量(在先前查询中起作用的变量)替换时却没有。提前致谢。
需要修正 cursor.execute
的语法,例如
cursor.execute('... WHERE MOTORID = :mt_id AND RUNHOURS = :run_hr', mt_id=lMotorID[0][0], run_hr=lHours[2][0])
使用百分号作为参数前缀对于通过 python 的 MySQL 连接有效,而 Oracle 接受冒号。
或另一种选择是使用有序元组:
cursor.execute('... WHERE MOTORID = :1 AND RUNHOURS = :2', (lMotorID[0][0],lHours[2][0]))
我有一个充满信息的数据库,我正在尝试编写一个 python 脚本来提取一些数据并将其组织到报告中。这是我目前所拥有的:
import cx_Oracle
import pandas as pd
conn = cx_Oracle.connect('REDACTED')
cursor = conn.cursor()
# Currently hard-coded to return single known motor number
cursor.execute('SELECT MOTORID FROM MOTORS WHERE SERIALNUM=804')
# Returns [(11)]
lMotorID = cursor.fetchall()
# Query Assessments for list of how long the motor had run when assessment was taken
cursor.execute("SELECT DISTINCT RUNHOURS FROM ASSESSMENTS WHERE MOTORID = %s \
ORDER BY RUNHOURS" % lMotorID[0])
# Returns [(0), (0.91), (8), (25), ...]
lHours = cursor.fetchall()
# Query for number of installed sensors by senor type
cursor.execute("SELECT SENSTYP, COUNT(STATUS) FROM HEALTH LEFT JOIN INSTRUMENTATION \
ON HEALTH.INSTROID = INSTRUMENTATION.INSTROID LEFT JOIN ASSESSMENTS \
ON HEALTH.ASSESSID = ASSESSMENTS.ASSESSID WHERE ASSESSMENTS.ASSESSID \
IN (SELECT ASSESSID FROM ASSESSMENTS WHERE MOTORID = 11 AND RUNHOURS = %s) \
GROUP BY SENSTYP ORDER BY SENSTYP" % lHours[2])
# Returns a 2-column dataframe with sensor type in column 0 and the total in column 1
dfTotal = pd.DataFrame(cursor.fetchall())
因为我希望它适用于任何电机,所以我想用一个变量替换硬编码的 MOTORID = 11
。我尝试用这个替换最后一个查询:
cursor.execute("SELECT SENSTYP, COUNT(STATUS) FROM HEALTH LEFT JOIN INSTRUMENTATION \
ON HEALTH.INSTROID = INSTRUMENTATION.INSTROID LEFT JOIN ASSESSMENTS \
ON HEALTH.ASSESSID = ASSESSMENTS.ASSESSID WHERE ASSESSMENTS.ASSESSID \
IN (SELECT ASSESSID FROM ASSESSMENTS WHERE MOTORID = %s AND RUNHOURS = %s) \
GROUP BY SENSTYP ORDER BY SENSTYP" % (lMotorID[0], lHours[2]))
dfTotal = pd.DataFrame(cursor.fetchall())
那是我收到 ORA-00936 错误的时候。我不明白为什么查询是用硬编码值完成的,但当该值被变量(在先前查询中起作用的变量)替换时却没有。提前致谢。
需要修正 cursor.execute
的语法,例如
cursor.execute('... WHERE MOTORID = :mt_id AND RUNHOURS = :run_hr', mt_id=lMotorID[0][0], run_hr=lHours[2][0])
使用百分号作为参数前缀对于通过 python 的 MySQL 连接有效,而 Oracle 接受冒号。
或另一种选择是使用有序元组:
cursor.execute('... WHERE MOTORID = :1 AND RUNHOURS = :2', (lMotorID[0][0],lHours[2][0]))