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 [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.