如何在Python脚本中导入MySQL数据库?

时间:2015-12-14 20:15:41

标签: python mysql pymysql

我在StackOverflow上看到过一些类似的问题,但是没有找到有效的答案;请参阅http://stackoverflow.com/questions/4408714/execute-sql-file-with-python-mysqldbhttp://stackoverflow.com/questions/10593876/execute-sql-file-in-python-with-mysqldb?lq=1

这是我的代码:

import pymysql
import sys
import access  # holds credentials
import mysql_connector  # connects to MySQL, is fully functional


class CreateDB(object):
    def __init__(self):
        self.cursor = None
        self.conn = pymysql.connect(host, user, passwd)

    def create_database(self):
        try:
            with self.conn.cursor() as cursor:
                for line in open('file.sql'):
                    cursor.execute(line)
            self.conn.commit()

        except Warning as warn:
            f = open(access.Credentials().error_log, 'a')
            f.write('Warning: %s ' % warn + '\nStop.\n')
            sys.exit()

create = CreateDB()
create.create_database()

当我运行脚本时,我收到以下错误:

pymysql.err.InternalError: (1065, 'Query was empty')

当我直接通过MySQL导入时,我的.sql文件已成功加载,并且文件的每一行都有一个查询。有人有解决方案吗?我已经按照其他帖子的建议,但没有取得任何成功。

2 个答案:

答案 0 :(得分:2)

通过以下方式处理文件末尾的空行:

if line.strip(): cursor.execute(line)

答案 1 :(得分:0)

您可以通过使用官方MySQL Connector/Python和文件cursor.execute method中的Multi参数来一次执行文件中的所有SQL。

第二个链接中的报价:

  

如果将multi设置为True,则execute()可以执行操作字符串中指定的多个语句。它返回一个迭代器,该迭代器可以处理每个语句的结果。

链接中的示例代码,稍作修改:

import mysql.connector

file = open('script.sql')
sql = file.read()


cnx = mysql.connector.connect(user='u', password='p', host='h', database='d')
cursor = cnx.cursor()

for result in cursor.execute(sql, multi=True):
  if result.with_rows:
    print("Rows produced by statement '{}':".format(
      result.statement))
    print(result.fetchall())
  else:
    print("Number of rows affected by statement '{}': {}".format(
      result.statement, result.rowcount))

cnx.close()