【问题标题】:Follow up: Execute .sql files from python跟进:从python执行.sql文件
【发布时间】:2012-04-30 17:28:06
【问题描述】:

一年多以前有人问过这个问题:Execute .sql files that are used to run in SQL Management Studio in python。

我正在用 python 编写一个脚本,该脚本连接到 SQL 服务器,并基于大型(几 GB).sql 文件中的 SQL 命令创建和填充数据库。

看起来 SQLCMD 需要下载并安装 SQL Server Express。是否有其他方法可以从 python 执行 .sql 文件,而无需使用我的脚本的每个人都下载和安装 SQL Server? pyodbc 有这个能力吗?

编辑:

这是另一个类似的问题: execute *.sql file with python MySQLdb

同样,解决方案是从命令(在本例中为 mysql.exe)调用实用程序,并将文件列为参数。

在我看来,应该有一种方法可以使用 Python 的 DB API 库之一,但我还没有找到它,所以我正在寻找可以使用的 *.exe,如 SQLCMD 或 MYSQL从命令行运行文件。

附:如果我看不正确,请随时纠正我。也许下面的代码和从命令行运行一样高效:

for line in open('query.sql','r'):
    cursor.execute(line)

【问题讨论】:

  • 对不起,什么?您正在尝试创建没有安装服务器的数据库???否则 sqlcmd 应该与服务器一起安装(尽管它可能不在您的 PATH 上)。 - - - 当然你也可以使用pyodbc或pymssql连接数据库并执行文件中的命令。
  • 没有。服务器已经安装好了。我只需要连接到服务器并从没有安装 SQL Server 的计算机远程执行 SQL 命令。
  • 我知道我可以使用 pyodbc 读取文件并将其内容作为字符串执行,但是从文件中读取脚本并进入内存而不是让 SQL Server 直接从文件中读取似乎有点过分。
  • 您如何将文件发送到服务器以“直接读取”?如果它在远程计算机上,服务器将无法直接访问它。而且您不需要一次读取整个文件,一次只需一个命令...
  • SQLCMD 具有连接到远程服务器的连接参数,这不是问题(如果是,我仍然可以远程建立连接并引用存储在服务器上的文件——文件位置是不是我担心的)。我认为我上面的编辑应该有助于澄清我在寻找什么。

标签: python sql sql-server pyodbc python-db-api


【解决方案1】:

我发现在 python 中读取文件并使用 pyodbc 批量执行实际上比在外部使用 SQLCMD 实用程序更快(而且我不必在运行脚本的每台计算机上安装 SQLCMD!)。

这是我使用的代码(因为 pyodbc 似乎没有executescript() 方法):

with open(scriptPath, 'r') as inp:
    for line in inp:
        if line == 'GO\n':
            c.execute(sqlQuery)
            sqlQuery = ''
        elif 'PRINT' in line:
            disp = line.split("'")[1]
            print(disp, '\r')
        else:
            sqlQuery = sqlQuery + line
inp.close()

【讨论】:

  • 很酷的想法,但它不适用于具有多个对象的复杂脚本。我认为 SQLCMD 会更容易。
【解决方案2】:

不确定这是否是您要问的,但为什么不直接从 Python 使用 MS SQL?有像 pymssql 这样的库可以让你这样做。或者您可以使用 ODBC。

有关 Python MS SQL 驱动程序的列表,请参阅 http://wiki.python.org/moin/SQL%20Server

【讨论】:

  • 我一直在使用 pyodbc,它在大多数情况下都可以正常工作,直到您需要执行 GB 大小的 .sql 文件。 pymssql 是否允许您从文件执行查询?
【解决方案3】:

SQLCMD 和其他管理实用程序可免费下载。它们是 Microsoft 所称的“SQL Server 功能包”的一部分。

我了解到您希望执行大批量导入。为此,您可能需要查看 BCP 实用程序。下载http://www.microsoft.com/en-us/download/details.aspx?id=16978

使用 SQL,您还可以执行 BULK INSERT。该命令可以将文件中的数据插入到 SQL 数据库中。

当然,另一种方法是使用 SQL Server 集成服务进行纯 ETL 作业。

【讨论】:

  • 谢谢,克里斯蒂安。不完全是我想听到的答案,但它确实回答了我现在的问题。 SQLCMD 运行良好。我想我可以在我的脚本中包含 exe,以便在其他机器上运行它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-12
  • 2011-05-23
  • 2021-03-06
  • 2016-09-02
  • 1970-01-01
相关资源
最近更新 更多