【问题标题】:Launch SQL stored procedures from python with sqlalchemy?使用 sqlalchemy 从 python 启动 SQL 存储过程?
【发布时间】:2020-04-06 23:12:43
【问题描述】:

我可以使用此脚本从我的 jupyter 笔记本成功连接到 SQL Server Management Studio:

from sqlalchemy import create_engine
import pyodbc 
import csv
import time
import urllib

params = urllib.parse.quote_plus('''DRIVER={SQL Server Native Client 11.0};
                                    SERVER=SV;
                                    DATABASE=DB;
                                    TRUSTED_CONNECTION=YES;''')

engine = create_engine("mssql+pyodbc:///?odbc_connect=%s" % params)

我设法执行了一些这样的 SQL 脚本:

engine.execute("delete from table_name_X")

但是,我无法执行存储过程。我从stored procedures with sqlAlchemy 中看到的内容尝试了以下脚本。以下脚本的输出类似于“sqlalchemy.engine.result.ResultProxy at 0x173ed18e470”,但实际上并未执行该过程(什么也没发生):

# test 1
engine.execute('stored_procedure_name')
# test 2
from sqlalchemy import func
from sqlalchemy.orm import sessionmaker
session = sessionmaker(bind=engine)()
session.execute(func.upper('stored_procedure_name'))

您能告诉我执行存储过程的正确方法吗?

【问题讨论】:

  • 您链接的主题有很多对您有用的信息。具体来说,func 是有限的。还有其他你应该阅读的 cmets。您怎么知道存储过程“已执行但实际上什么也没发生”?老实说,这是不可能的。存储过程未在服务器上执行,或者已执行。你试过简单地做session.execute('your_stored_proc')吗?您是否包括架构?你的 proc 需要参数吗?
  • 检查此信息...在调用存储过程部分-> docs.sqlalchemy.org/en/13/core/connections.html
  • 确实,我阅读并尝试调整所有 cmets。我说存储过程已执行,但没有发生任何事情,因为 python 输出看起来正在工作,而当我检查我的 sql 表时,我发现该过程没有工作
  • 在您的示例中,您使用 delete ....如果您尝试使用 select....work?
  • 为了明确定义,SQL Server Management Studio (SSMS) 是 SQL Server 数据库的客户端用户界面。因此,您永远不会连接到它。您正在连接到 SQL Server(即 SQL Server 数据库引擎)。

标签: python sql sql-server stored-procedures sqlalchemy


【解决方案1】:

使用pyodbc调用存储过程的方式是:

cursor.execute("{CALL usp_StoreProcedure}") 

我找到了参考此链接的解决方案。 https://github.com/mkleehammer/pyodbc/wiki/Calling-Stored-Procedures

这里是一个例子:

import pyodbc
import urllib
import sqlalchemy as sa


params = urllib.parse.quote_plus("DRIVER={SQL Server Native Client 11.0};"
                                 "SERVER=xxx.xxx.xxx.xxx;"
                                 "DATABASE=DB;"
                                 "UID=user;"
                                 "PWD=pass")

engine = sa.create_engine("mssql+pyodbc:///?odbc_connect={}".format(params))

connection = engine.raw_connection()
try:
    cursor = connection.cursor()
    cursor.execute("{CALL stored_procedure_name}")
    result = cursor.fetchall()
    print(result)
    connection.commit()
finally:
    connection.close()

【讨论】:

  • 我在尝试您的解决方案时遇到此错误: in 3 cursor = connection.cursor() 4 cursor.execute("{CALL procedure_name}" ) ----> 5 result = cursor.fetchall() 6 print(result) 7 connection.commit() ProgrammingError: 没有结果。以前的 SQL 不是查询。
【解决方案2】:

终于用下面的函数解决了我的问题:

def execute_stored_procedure(engine, procedure_name):
    res = {}
    connection = engine.raw_connection()
    try:
        cursor = connection.cursor()
        cursor.execute("EXEC "+procedure_name)
        cursor.close()
        connection.commit()
        res['status'] = 'OK'
    except Exception as e:
        res['status'] = 'ERROR'
        res['error'] = e
    finally:
        connection.close() 
    return res

【讨论】:

    猜你喜欢
    • 2018-01-10
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 2019-03-06
    • 1970-01-01
    相关资源
    最近更新 更多