Как зафиксировать выполнение хранимой процедуры с помощью pyodbc?

#python #azure-sql-database #pyodbc

Вопрос:

Я пытаюсь выполнить хранимую процедуру с помощью pyodbc в ссылках данных, после выполнения SP я попытался зафиксировать соединение, но фиксации не происходит. Здесь я даю свой код, пожалуйста, помогите мне решить эту проблему.

 import pyodbc

####   Connecting Azure SQL
def db_connection():
  try:
    username = "starsusername"
    password = "password-db"
    server = "server-name"
    database_name = "db-name2"
    port = "db-port"
    conn=pyodbc.connect('Driver={ODBC Driver 17 for SQL server};SERVER=tcp:' server ',' port ';DATABASE='  database_name  ';UID='  username  ';PWD='  password)
    cursor=conn.cursor()
    return cursor, conn
  except Exception as e:
    print("Faild to Connect AZURE SQL: n" str(e))

cursor, conn = db_connection()
# conn1.autocommit=True
cursor.execute("delete from db.table_name")
cursor.execute("insert into db.table_name(BUSINESS_DATE) values('2021-10-02')")
cursor.execute("exec db.SP_NAME '20211023'")
conn.commit()
conn.close()
 

здесь я фиксирую соединение после освобождения SP. удаление и вставка вообще не происходит. и я попробовал с помощью cursor.execute(«УСТАНОВИТЬ NOCOUNT НА; имя_исполнителя db.SP ‘20211023’»), но это также не работает.

заранее спасибо

Ответ №1:

Если вы проверите этот документ на pyodbc, вы обнаружите, что —

Чтобы вызвать хранимую процедуру прямо сейчас, передайте вызов методу execute, используя либо формат, который распознает ваша база данных, либо формат escape-вызова ODBC. Затем драйвер ODBC переформатирует вызов для вас в соответствии с заданной базой данных.

Обратите внимание, что после настройки или завершения подключения попробуйте сделать это перед тем, как звонить в свой центр поддержки, и это поможет. conn.autocommit = True По умолчанию это значение равно false.

  1. Выполнение хранимой процедуры.

    Вы сможете выполнить свою хранимую процедуру, если будете следовать приведенному ниже фрагменту кода.

     cursor = conn.cursor()
    conn.autocommit = True
    executesp = """EXEC yourstoredprocedure """
    cursor.execute(executesp)
    conn.commit()
     
  2. Удалите записи в SQL Server

    Вы можете удалить запись, как показано в приведенном ниже примере.

     ...#just an example
    cursor.execute('''
                DELETE FROM product 
                WHERE product_id in (5,6) 
               ''')
    conn.commit()
     

    Не забудьте добавить функцию conn.commit() в конце кода, чтобы гарантировать выполнение команды.

  3. Вставить запись в SQL Server

    Приведенный ниже фрагмент показывает, как мы можем сделать то же самое.

     ...#just an example
    cursor.execute("INSERT INTO EMP (EMPNO, ENAME, JOB, MGR) VALUES (535, 'Scott', 'Manager', 545)")
    conn.commit()
     

Я предлагаю вам прочитать следующий документ для получения дополнительной информации.

Комментарии:

1. вместо того, чтобы совершать три раза, я просто хочу совершить один раз (наконец), и когда я попытался выполнить сам SP, выполнение SP выполнено, и соединение закрыто в python, но оно все еще работает в бэкэнде SSMS. в целевых таблицах ничего не меняется (вставка, удаление..)

2. Да, вы можете сделать это также вместо того, чтобы совершать фиксацию на каждом шаге, которую вы можете совершить только один раз в конце.