sql脚本运行时vi mysql python给出错误

时间:2017-01-03 04:52:15

标签: python mysql python-2.7

我编写了一个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')

有人可以帮我解决错误吗?

1 个答案:

答案 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),并且与示例的行号不匹配。代码是否提供了实际生成堆栈跟踪的完整相关代码部分?