Hi all, I’m new to python and SQLAlchemy, I'm trying to understand how to execute multiple insert/update queries in one SQL using Python/SQLAlchemy:
Requirement Execute multiple insert/update in one SQL: DECLARE @age INT = 160 INSERT INTO TEST_TABLE VALUES ('QZ_TEST', @age + 1) INSERT INTO TEST_TABLE VALUES ('QZ_TEST', 'not a number') INSERT INTO ANOTHER_TABLE VALUES ('QZ_TEST', @age + 2) Understand that this query looks ugly, but we do have many similar queries. (we're using a legacy database which is around 20 years old) Python Code Python: 2.7 - SQLAlchemy (1.0.8) - SQL SERVER 2012 def OdbcEngineSA(driver, conn_str): def connect(): return pyodbc.connect(conn_str, autocommit=True, timeout=120) return sqlalchemy.create_engine(driver + '://', creator=connect) def get_db_connection(): return OdbcEngineSA('mssql', 'DSN=mssql;Server=server,15001;database=DEV;UID=user_abc;PWD=pw_') def main(): db_connection = get_db_connection() sql = """ DECLARE @age INT = 160 INSERT INTO TEST_TABLE VALUES ('QZ_TEST', @age + 1) INSERT INTO TEST_TABLE VALUES ('QZ_TEST', 'not a number') INSERT INTO ANOTHER_TABLE VALUES ('QZ_TEST', @age + 2) """ try: db_connection.execute(sql) db_connection.commit() logger.info('db updated') except Exception as e: logger.error('Exception captured as expected: %s', e) db_connection.rollback() Please note that INSERT INTO TEST_TABLE VALUES ('QZ_TEST', 'not a number') will trigger an Error if I ran this single query with my SQL client: [S0001][245] Conversion failed when converting the varchar value 'not a number' to data type int. I'm expecting an exception captured by Python, however, the Python code runs without any exception. There's no exception captured by Python even though I replaced the SQL with: BEGIN TRY DECLARE @age INT = 160 INSERT INTO TEST_TABLE VALUES ('QZ_TEST', @age + 1) INSERT INTO TEST_TABLE VALUES ('QZ_TEST', 'not a number') INSERT INTO ANOTHER_TABLE VALUES ('QZ_TEST', @age + 2) END TRY BEGIN CATCH DECLARE @ErrorMessage NVARCHAR(4000) DECLARE @ErrorSeverity INT DECLARE @ErrorState INT SELECT @ErrorMessage = ERROR_MESSAGE(), @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE() RAISERROR (@ErrorMessage, @ErrorSeverity, -- Level 16 @ErrorState ) END CATCH My Questions · Am I using the correct method to execute the Query? · If my code was fine, how can I capture the actual SQL exception from Python? Many thanks in advance. -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.