我编写了一个python脚本来执行我的sql脚本。当我使用源手动运行此sql脚本时,它不会给我任何错误警告,它完全执行为:
mysql> source the_actual_script.sql
Database changed
Query OK, 0 rows affected, 1 warning (0.00 sec)
Query OK, 0 rows affected, 1 warning (0.00 sec)
Query OK, 0 rows affected, 1 warning (0.00 sec)
Query OK, 0 rows affected, 1 warning (0.00 sec)
Query OK, 0 rows affected, 1 warning (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.29 sec)
Query OK, 0 rows affected (0.00 sec)
mysql>
但是当我尝试通过我的python代码运行它时:
import MySQLdb
db = MySQLdb.connect("aws.eu-central-1.rds.amazonaws.com","prod_user","pass","db_name")
cursor = db.cursor()
for line in open("/home/ubuntu/PATCHER/the_check_query.sql"):
print cursor.execute(line)
db.close()
它给了我错误:
test.py:8: Warning: PROCEDURE saas_neopostsa.temp_prod does not exist
cursor.execute(line)
test.py:8: Warning: PROCEDURE saas_neopostsa.temp_prod_neopost does not exist
cursor.execute(line)
test.py:8: Warning: PROCEDURE saas_neopostsa.temp_prod_neopostsa does not exist
cursor.execute(line)
test.py:8: Warning: Unknown table 'temp_identity_neopostsa'
cursor.execute(line)
test.py:8: Warning: Unknown table 'temp_identity'
cursor.execute(line)
Traceback (most recent call last):
File "test.py", line 8, in <module>
cursor.execute(line)
File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 174, in execute
self.errorhandler(self, exc, value)
File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
raise errorclass, errorvalue
_mysql_exceptions.OperationalError: (1065, 'Query was empty')
有人可以帮我解决错误吗?
答案 0 :(得分:2)
MySQL ER_EMPTY_QUERY或空查询错误表示正在执行的查询为空或MySQL无法转换为字符串的值。我将查看脚本文件,并确保每行都有一个SQL语句。
for line in open("/home/ubuntu/PATCHER/the_check_query.sql"):
print cursor.execute(line)
db.close()
您应该考虑文件操作的with
关键字(假设您的版本支持此关键字)。我可能会通过某种验证来执行此操作,例如:
import MySQLdb
db = MySQLdb.connect("aws.eu-central-1.rds.amazonaws.com","prod_user","pass","db_name")
cursor = db.cursor()
# Use with to open the file,'rb' for compatibility
with open("/home/ubuntu/PATCHER/the_check_query.sql",'rb') as infile:
# Using list comprehension, read lines ecluding non-empty
# or lines containing only a newline ('\n') character
lines = [ln for ln in infile.readlines() if ln and ln != '\n']
# The file is now closed and you have a (somewhat) curated command list
for line in lines:
try:
cursor.execute(line)
except:
print line # see what exactly is being executed
# Other exception stuff here
db.close()
这至少可以让您清楚地了解导致空查询错误的命令。
第5次测试后,脚本文件中的任何地方是否有空行或加分号(;;)?我有点困惑,因为堆栈跟踪显示cursor.execute(line)
而不是代码示例中的print cursor.execute(line)
,并且与示例的行号不匹配。代码是否提供了实际生成堆栈跟踪的完整相关代码部分?