在Python中执行SQL Server管理工作室中的.sql文件
作为交付的一部分,我们的开发人员会提供一些数据和结构的脚本,这些脚本保存在.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来启动它。