使用SQL炼金术和Python删除SQL过程/函数

2024-10-16 20:47:08 发布

您现在位置:Python中文网/ 问答频道 /正文

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

首先,程序_删除.sql,用于存储SQL drop命令。在

/*
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语句可以工作,但是在sqlmanagementstudio中执行时,这些语句都可以独立工作

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

^{pr2}$

下一个程序_sql测试,它由代码执行,并在数据库中创建关联的存储过程。为了简洁起见,我只添加了代码的顶部:

CREATE PROCEDURE [dbo].[proc_create_tractor_test] 
    @meta_risks varchar(256)
AS 
BEGIN

最后,主要文件拼凑在下面。您会注意到,我创建了SQL炼金术引擎,这些引擎在使用连接信息初始化后被传递给helper函数。这些引擎和我引用的其他SQL过程一样都是以列表的形式传递的,helper函数只需遍历每个引擎和过程,一次执行一个。还使用PYMSSQL作为驱动程序进行连接,这是很好的工作。在

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

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

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)

Tags: 文件函数代码testimportsql过程create