使用SQL Alchemy和Python删除SQL过程/函数

使用SQL Alchemy和Python删除SQL过程/函数,python,sql-server,pandas,sqlalchemy,Python,Sql Server,Pandas,Sqlalchemy,我正在构建一个更大的应用程序的框架,它依赖SQL Server完成大部分繁重的工作,并将数据传递回Pandas供用户使用/插入到平面文件或Excel中。到目前为止,我的代码能够将存储过程和函数插入到数据库中,并在没有问题的情况下执行它们。但是,当我第二次尝试在同一个数据库中运行代码时,drop命令似乎不起作用。下面是各种文件和通过它们的代码流 首先是proc_drop.sql,用于存储SQLDROP命令 /* IF EXISTS(SELECT * FROM sys.objects WHERE o

我正在构建一个更大的应用程序的框架,它依赖SQL Server完成大部分繁重的工作,并将数据传递回Pandas供用户使用/插入到平面文件或Excel中。到目前为止,我的代码能够将存储过程和函数插入到数据库中,并在没有问题的情况下执行它们。但是,当我第二次尝试在同一个数据库中运行代码时,drop命令似乎不起作用。下面是各种文件和通过它们的代码流

首先是proc_drop.sql,用于存储SQLDROP命令

/*
IF EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'proc_create_tractor_test'))
DROP PROCEDURE [dbo].[proc_create_tractor_test]
GO
IF EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'fn_mr_parse'))
DROP FUNCTION [dbo].[fn_mr_parse]
GO
*/

IF OBJECT_ID('[proc_create_tractor_test]') IS NOT NULL DROP PROCEDURE [proc_create_tractor_test]
IF OBJECT_ID('[fn_mr_parse]') IS NOT NULL DROP PROCEDURE [fn_mr_parse]
我意识到文件中有两种drop语句。我们已经测试了许多不同的迭代,在Python/SQL Alchemy执行时,drop语句似乎都不起作用,但在SQL Management Studio中执行时,所有语句都能独立工作

接下来是helper.py文件,我将在其中存储helper函数。我的drop SQL最初作为文件输入“deploy_procedures”函数,并在函数体中执行。此后,我将drop SQL读取/执行隔离到另一个函数中,仅用于测试目的

def clean_databases(engines, procedures):
    for engine in engines:
        for proc in procedures:
            with open(proc, "r") as procfile:
                code = procfile.read()
                print code

            engine.execute(code)

def deploy_procedures(engines, procedures):
    for engine in engines:
        for proc in procedures:
            with open(proc, "r") as procfile:
                code = procfile.read()

            engine.execute(code)
接下来,proc_create_tractor_test.sql,由代码执行,并在数据库中创建关联的存储过程。为了简洁起见,我只添加了代码的顶部部分:

CREATE PROCEDURE [dbo].[proc_create_tractor_test] 
    @meta_risks varchar(256)
AS 
BEGIN
最后,下面是主要的文件。您会注意到,我创建了SQL Alchemy引擎,在使用连接信息初始化之后,这些引擎被传递给帮助函数。这些引擎和我引用的其他SQL过程一样作为列表传递,helper函数只是在每个引擎和过程中迭代,每次执行一个。还使用PYMSSQL作为驱动程序进行连接,该驱动程序工作正常

因此,当第二次运行代码时,试图创建函数或存储过程时,“deploy_procedures”函数崩溃。据我所知,这是因为我解释的顶部的drop-SQL从未运行过

谁能解释一下问题是什么,或者我是否遗漏了一些显而易见的东西

run_tractor.py:

import pandas
import pandas.io.sql as pdsql
import sqlalchemy as sqla
import xlwings
import helper as hlp
# Last import contains user-defined functions

# ---------- SERVER VARIABLES ---------- #
server =  'DEV\MSSQLSERVER2K12'
database = 'injection_test'
username= 'username'
password = 'pwd'

# ---------- CONFIGURING [Only change base path if relevant, not file names  ---------- #
base_path = r'C:\Code\code\Tractor Analysis Basic Code'
procedure_drop = r'' + base_path + '\proc_drop.sql'
procedure_create_curves = r'' + base_path + '\proc_create_tractor_test.sql'
procedure_create_mr_function = r'' + base_path + '\create_mr_parse_function.sql'
procedures = [procedure_create_curves, procedure_create_mr_function]
del_procedures = [procedure_drop]

engine_analysis = sqla.create_engine('mssql+pymssql://{2}:{3}@{0}/{1}'.format(server,database,username,password))
engine_analysis.connect()
engines = [engine_analysis]

hlp.clean_databases(engines, del_procedures)
hlp.deploy_procedures(engines, procedures)

只是一个快速更新:根据进一步的测试,sqlalchemy API/SQL接口似乎有问题。