在Python中执行SQL Server管理工作室中的.sql文件

1 投票
2 回答
4237 浏览
提问于 2025-04-16 12:51

作为交付的一部分,我们的开发人员会提供一些数据和结构的脚本,这些脚本保存在.sql文件里。我通常会“双击”这些文件,让它们在“Microsoft SQL Server Management Studio”中打开。打开后,管理工作室会让我输入数据库服务器和用户名/密码。我手动输入这些信息,然后点击执行按钮来运行这些脚本。

这些脚本里包含了结构和数据的SQL命令。每个脚本可能包含多个数据命令(比如选择、插入、更新等)。结构和数据的脚本是分开保存在不同的.sql文件里的。

这些脚本还包括存储过程和函数等内容,并且里面会有注释和描述。

我想通过Python来自动执行这些脚本。我查看了pyodbc和pymssql,但它们似乎不能解决我的问题。通过pyodbc,我需要逐个读取每个.sql文件,提取SQL命令并一个一个执行。因为文件里可能有注释、描述、存储过程等,所以读取这些文件会有点困难。

有没有人能给我一些自动化的建议呢?

提前谢谢大家。

2 个回答

3

如果这个文件的大小在内存可以接受的范围内,你可以用下面的代码来解析它,并通过 pymssql 来执行每条语句。

每当代码找到一行以 GO 或者 ; 结尾时,就会执行相应的语句。

    _conn = pymssql.connect(** connection settings **)
    _cur = _conn.cursor()
    with open(filename, 'r') as f:
        script = f.read().decode('utf-8')  # or whatever its encoding is
    script = re.sub(r'\/\*.*?\*\/', '', script, flags=re.DOTALL)  # remove multiline comment
    script = re.sub(r'--.*$', '', script, flags=re.MULTILINE)  # remove single line comment

    sql = []
    do_execute = False
    for line in script.split(u'\n'):
        line = line.strip()
        if not line:
            continue
        elif line.upper() == u'GO':
            do_execute = True
        else:
            sql.append(line)
            do_execute = line.endswith(u';')

        if do_execute and filter(None, sql):  # ignore if only blank lines
            cursor.execute(u'\n'.join(sql).encode("cp1252"))  # I have experienced problems when executing utf-8
            do_execute = False
            sql = []

    _conn.close()
4

你可以直接用sqlcmd来运行它们。sqlcmd是一个命令行工具,可以让你从命令行执行.sql脚本,我相信你可以通过Python来启动它。

撰写回答