That did it.

2015-07-28 12:06:16,283 INFO sqlalchemy.engine.base.Engine INSERT INTO 
corp.test_table (batch_id, batch_type, scheduled_date, status, emp_id, 
bill_per, label, log_file, debug_file, completed_date) VALUES (:batch_id, 
:batch_type, :scheduled_date, :status, :emp_id, :bill_per, :label, 
:log_file, :debug_file, :completed_date)
2015-07-28 12:06:16,283 INFO sqlalchemy.engine.base.Engine {'log_file': 
None, 'batch_id': 999999, 'debug_file': None, 'scheduled_date': 
datetime.datetime(2015, 7, 28, 12, 6, 16, 282779), 'label': 'Testing 
insert', 'batch_type': 1, 'bill_per': 201501, 'status': 0, 
'completed_date': None, 'emp_id': 8329}
2015-07-28 12:06:16,311 INFO sqlalchemy.engine.base.Engine COMMIT

You just saved my sanity.

Thanks a million!

And thanks to Jonathan Vanasco, your suggestions didn't work, but I learned 
a few new settings.

On Tuesday, July 28, 2015 at 11:54:14 AM UTC-4, Michael Bayer wrote:
>
>  Just curious, can you try out cx_Oracle 5.1.3?   I've seen some problems 
> reported with Py3K and cx_Oracle 5.2.
>
> On 7/28/15 11:17 AM, Bob Ternosky wrote:
>  
> I'm new to SQLAlchemy and have been playing with it for a week. I've got 
> many SELECT based pieces working and exercising properly, but have hit a 
> huge wall when trying to test inserts. Worse, what's happening makes no 
> sense at all.
> This will hopefully contain the full set of information needed. Any help 
> would be greatly appreciated.
>
> The summary: When running a simple test insert it will fail with the error:
>
>    cx_Oracle.IntegrityError: ORA-01400: cannot insert NULL into 
> ("CORP"."TEST_TABLE"."XXX")
>
> where XXX changes just about every time I run the insert statement - with 
> identical data.
>
> My machine is running Linux Mint 17.2 64-bit
>
> Software:
> * Python 3.4.0 (with virtualenv)
> * SQLAlchemy 1.0.7
> * cx_Oracle 5.2
>
> Connecting to an Oracle 9i (9.2.0.6.0) database (joys of legacy systems).
> Using Oracle Instant Client 11.2.0 libraries
>
> An Oracle "description" of the table (the table is empty):
>
> > desc test_table
> BATCH_ID       NOT NULL NUMBER(10,0) 
> BATCH_TYPE     NOT NULL NUMBER(2,0)  
> SCHEDULED_DATE NOT NULL DATE         
> STATUS         NOT NULL NUMBER(1,0)  
> EMP_ID         NOT NULL NUMBER(10,0) 
> BILL_PER       NOT NULL NUMBER(6,0)  
> LABEL          NOT NULL VARCHAR2(128)
> LOG_FILE       NULL     VARCHAR2(256)
> DEBUG_FILE     NULL     VARCHAR2(256)
> COMPLETED_DATE NULL     DATE         
>
> The table resides in the "CORP" schema.
>
>
>
> Test script named: isolated.py
>
> ----
> # isolated.py
> import argparse
> import datetime
>
> from sqlalchemy import Column, create_engine, DateTime, insert, MetaData, 
> Numeric, String, Table
>
> # Declare insert test table
> metadata = MetaData()
> t_test_table = Table(
>     'test_table', metadata,
>     Column('batch_id', Numeric(9, 0, asdecimal=False), primary_key=True),
>     Column('batch_type', Numeric(2, 0, asdecimal=False), nullable=False),
>     Column('scheduled_date', DateTime, nullable=False),
>     Column('status', Numeric(1, 0, asdecimal=False), nullable=False),
>     Column('emp_id', Numeric(10, 0, asdecimal=False), nullable=False),
>     Column('bill_per', Numeric(6, 0, asdecimal=False), nullable=False),
>     Column('label', String(128), nullable=False),
>     Column('log_file', String(256)),
>     Column('debug_file', String(256)),
>     Column('completed_date', DateTime),
>     schema='corp'
> )
>
> # Oracle Credentials
> USER   = 'REDACTED'
> PASSWD = 'REDACTED'
> SID    = 'REDACTED'
>
> ###################
> # Main
> ###################
> parser = argparse.ArgumentParser(description = 'Test SQLAlchemy Insert')
> parser.add_argument('-c', '--cxoracle', dest = 'cxoracle', action = 
> 'store_true',
>                     required = False, default = False, help = 'Use 
> oracle+cx_oracle engine')
> parser.add_argument('-o', '--oracle', dest = 'oracle', action = 
> 'store_true',
>                     required = False, default = False, help = 'Use oracle 
> only engine')
>
> args = parser.parse_args()
> if not args.cxoracle and not args.oracle:
>     parser.error("You must provide one of: [-c] [-o]")
>
> # Pick an Oracle connection method
> if args.cxoracle:
>     LIBRARY = 'oracle+cx_oracle'
> else:
>     LIBRARY = 'oracle'
>
> engine = create_engine('{}://{}:{}@{}'.format(LIBRARY, USER, PASSWD, SID), 
> echo = True)
> conn = engine.connect()
>
> values = dict(batch_id       = 999999,
>               batch_type     = 1,
>               scheduled_date = datetime.datetime.now(),
>               status         = 0,
>               emp_id         = 8329,
>               bill_per       = 201501,
>               label          = "Testing insert",
>               log_file       = None,
>               debug_file     = None,
>               completed_date = None)
>
> tbl = t_test_table
> ins = tbl.insert().values(values)
> result = conn.execute(ins)
> print(result)
>
> # Cleanup
> conn.close()
> engine.dispose()
>
>
> -----
>
> I tried to isolate cx_Oracle vs basic Oracle, but no luck. If I run the 
> script (with either -c or -o) I get the error message about the NULL 
> violation. If I run it twice in a row, I get the same message, but the 
> column changes. I've gotten batch_id, batch_type, status, emp_id, 
> scheduled_date.
>
> I've added some debug output to SQLAlchemy's "do_execute" method in 
> "python3.4/site-packages/sqlalchemy/engine/default.py:
>
>    def do_execute(self, cursor, statement, parameters, context=None):
> +        print("*" *70)
> +       print(cursor)
> +        print(statement)
> +       print(parameters)
> +        print(context)
> +        print("*" *70)
>         cursor.execute(statement, parameters)
>
>
> Here is the output of 2 consecutive runs against an empty table:
>
>
> (venv)[bash]$ python isolated.py -c
> 2015-07-28 11:12:40,599 INFO sqlalchemy.engine.base.Engine b'SELECT USER 
> FROM DUAL'
> 2015-07-28 11:12:40,599 INFO sqlalchemy.engine.base.Engine {}
> **********************************************************************
> <cx_Oracle.Cursor on <cx_Oracle.Connection to USER@DB>>
> b'SELECT USER FROM DUAL'
> {}
> <sqlalchemy.dialects.oracle.cx_oracle.OracleExecutionContext_cx_oracle 
> object at 0x7f6dda491a90>
> **********************************************************************
> 2015-07-28 11:12:40,654 INFO sqlalchemy.engine.base.Engine SELECT 
> CAST('test plain returns' AS VARCHAR(60 CHAR)) AS anon_1 FROM DUAL
> 2015-07-28 11:12:40,654 INFO sqlalchemy.engine.base.Engine {}
> **********************************************************************
> <cx_Oracle.Cursor on <cx_Oracle.Connection to USER@DB>>
> SELECT CAST('test plain returns' AS VARCHAR(60 CHAR)) AS anon_1 FROM DUAL
> {}
> None
> **********************************************************************
> 2015-07-28 11:12:40,708 INFO sqlalchemy.engine.base.Engine SELECT 
> CAST('test unicode returns' AS NVARCHAR2(60)) AS anon_1 FROM DUAL
> 2015-07-28 11:12:40,708 INFO sqlalchemy.engine.base.Engine {}
> **********************************************************************
> <cx_Oracle.Cursor on <cx_Oracle.Connection to USER@DB>>
> SELECT CAST('test unicode returns' AS NVARCHAR2(60)) AS anon_1 FROM DUAL
> {}
> None
> **********************************************************************
> 2015-07-28 11:12:40,844 INFO sqlalchemy.engine.base.Engine b'INSERT INTO 
> corp.test_table (batch_id, batch_type, scheduled_date, status, emp_id, 
> bill_per, label, log_file, debug_file, completed_date) VALUES (:batch_id, 
> :batch_type, :scheduled_date, :status, :emp_id, :bill_per, :label, 
> :log_file, :debug_file, :completed_date)'
> 2015-07-28 11:12:40,844 INFO sqlalchemy.engine.base.Engine {b'bill_per': 
> 201501, b'batch_type': 1, b'status': 0, b'scheduled_date': 
> datetime.datetime(2015, 7, 28, 11, 12, 40, 843806), b'debug_file': None, 
> b'log_file': None, b'label': 'Testing insert', b'completed_date': None, 
> b'emp_id': 8329, b'batch_id': 999999}
> **********************************************************************
> <cx_Oracle.Cursor on <cx_Oracle.Connection to USER@DB>>
> b'INSERT INTO corp.test_table (batch_id, batch_type, scheduled_date, 
> status, emp_id, bill_per, label, log_file, debug_file, completed_date) 
> VALUES (:batch_id, :batch_type, :scheduled_date, :status, :emp_id, 
> :bill_per, :label, :log_file, :debug_file, :completed_date)'
> {b'bill_per': 201501, b'batch_type': 1, b'status': 0, b'scheduled_date': 
> datetime.datetime(2015, 7, 28, 11, 12, 40, 843806), b'debug_file': None, 
> b'log_file': None, b'label': 'Testing insert', b'completed_date': None, 
> b'emp_id': 8329, b'batch_id': 999999}
> <sqlalchemy.dialects.oracle.cx_oracle.OracleExecutionContext_cx_oracle 
> object at 0x7f6dd188e3c8>
> **********************************************************************
> 2015-07-28 11:12:40,900 INFO sqlalchemy.engine.base.Engine ROLLBACK
> Traceback (most recent call last):
>   File 
> "/home/rternosky/src/git/pluto/venv/lib/python3.4/site-packages/sqlalchemy/engine/base.py",
>  
> line 1139, in _execute_context
>     context)
>   File 
> "/home/rternosky/src/git/pluto/venv/lib/python3.4/site-packages/sqlalchemy/engine/default.py",
>  
> line 456, in do_execute
>     cursor.execute(statement, parameters)
> cx_Oracle.IntegrityError: ORA-01400: cannot insert NULL into 
> ("CORP"."TEST_TABLE"."BATCH_ID")
>
>
> The above exception was the direct cause of the following exception:
>
> Traceback (most recent call last):
>   File "isolated.py", line 68, in <module>
>     result = conn.execute(ins)
>   File 
> "/home/rternosky/src/git/pluto/venv/lib/python3.4/site-packages/sqlalchemy/engine/base.py",
>  
> line 914, in execute
>     return meth(self, multiparams, params)
>   File 
> "/home/rternosky/src/git/pluto/venv/lib/python3.4/site-packages/sqlalchemy/sql/elements.py",
>  
> line 323, in _execute_on_connection
>     return connection._execute_clauseelement(self, multiparams, params)
>   File 
> "/home/rternosky/src/git/pluto/venv/lib/python3.4/site-packages/sqlalchemy/engine/base.py",
>  
> line 1010, in _execute_clauseelement
>     compiled_sql, distilled_params
>   File 
> "/home/rternosky/src/git/pluto/venv/lib/python3.4/site-packages/sqlalchemy/engine/base.py",
>  
> line 1146, in _execute_context
>     context)
>   File 
> "/home/rternosky/src/git/pluto/venv/lib/python3.4/site-packages/sqlalchemy/engine/base.py",
>  
> line 1341, in _handle_dbapi_exception
>     exc_info
>   File 
> "/home/rternosky/src/git/pluto/venv/lib/python3.4/site-packages/sqlalchemy/util/compat.py",
>  
> line 188, in raise_from_cause
>     reraise(type(exception), exception, tb=exc_tb, cause=exc_value)
>   File 
> "/home/rternosky/src/git/pluto/venv/lib/python3.4/site-packages/sqlalchemy/util/compat.py",
>  
> line 181, in reraise
>     raise value.with_traceback(tb)
>   File 
> "/home/rternosky/src/git/pluto/venv/lib/python3.4/site-packages/sqlalchemy/engine/base.py",
>  
> line 1139, in _execute_context
>     context)
>   File 
> "/home/rternosky/src/git/pluto/venv/lib/python3.4/site-packages/sqlalchemy/engine/default.py",
>  
> line 456, in do_execute
>     cursor.execute(statement, parameters)
> sqlalchemy.exc.IntegrityError: (cx_Oracle.IntegrityError) ORA-01400: 
> cannot insert NULL into ("CORP"."TEST_TABLE"."BATCH_ID")
>  [SQL: b'INSERT INTO corp.test_table (batch_id, batch_type, 
> scheduled_date, status, emp_id, bill_per, label, log_file, debug_file, 
> completed_date) VALUES (:batch_id, :batch_type, :scheduled_date, :status, 
> :emp_id, :bill_per, :label, :log_file, :debug_file, :completed_date)'] 
> [parameters: {b'bill_per': 201501, b'batch_type': 1, b'status': 0, 
> b'scheduled_date': datetime.datetime(2015, 7, 28, 11, 12, 40, 843806), 
> b'debug_file': None, b'log_file': None, b'label': 'Testing insert', 
> b'completed_date': None, b'emp_id': 8329, b'batch_id': 999999}]
>
>
>
> (venv)[bash]$ python isolated.py -c
> 2015-07-28 11:12:43,349 INFO sqlalchemy.engine.base.Engine b'SELECT USER 
> FROM DUAL'
> 2015-07-28 11:12:43,350 INFO sqlalchemy.engine.base.Engine {}
> **********************************************************************
> <cx_Oracle.Cursor on <cx_Oracle.Connection to USER@DB>>
> b'SELECT USER FROM DUAL'
> {}
> <sqlalchemy.dialects.oracle.cx_oracle.OracleExecutionContext_cx_oracle 
> object at 0x7f726fa76ac8>
> **********************************************************************
> 2015-07-28 11:12:43,405 INFO sqlalchemy.engine.base.Engine SELECT 
> CAST('test plain returns' AS VARCHAR(60 CHAR)) AS anon_1 FROM DUAL
> 2015-07-28 11:12:43,405 INFO sqlalchemy.engine.base.Engine {}
> **********************************************************************
> <cx_Oracle.Cursor on <cx_Oracle.Connection to USER@DB>>
> SELECT CAST('test plain returns' AS VARCHAR(60 CHAR)) AS anon_1 FROM DUAL
> {}
> None
> **********************************************************************
> 2015-07-28 11:12:43,459 INFO sqlalchemy.engine.base.Engine SELECT 
> CAST('test unicode returns' AS NVARCHAR2(60)) AS anon_1 FROM DUAL
> 2015-07-28 11:12:43,459 INFO sqlalchemy.engine.base.Engine {}
> **********************************************************************
> <cx_Oracle.Cursor on <cx_Oracle.Connection to USER@DB>>
> SELECT CAST('test unicode returns' AS NVARCHAR2(60)) AS anon_1 FROM DUAL
> {}
> None
> **********************************************************************
> 2015-07-28 11:12:43,614 INFO sqlalchemy.engine.base.Engine b'INSERT INTO 
> corp.test_table (batch_id, batch_type, scheduled_date, status, emp_id, 
> bill_per, label, log_file, debug_file, completed_date) VALUES (:batch_id, 
> :batch_type, :scheduled_date, :status, :emp_id, :bill_per, :label, 
> :log_file, :debug_file, :completed_date)'
> 2015-07-28 11:12:43,614 INFO sqlalchemy.engine.base.Engine {b'log_file': 
> None, b'status': 0, b'batch_type': 1, b'completed_date': None, b'emp_id': 
> 8329, b'scheduled_date': datetime.datetime(2015, 7, 28, 11, 12, 43, 
> 613744), b'label': 'Testing insert', b'debug_file': None, b'bill_per': 
> 201501, b'batch_id': 999999}
> **********************************************************************
> <cx_Oracle.Cursor on <cx_Oracle.Connection to USER@DB>>
> b'INSERT INTO corp.test_table (batch_id, batch_type, scheduled_date, 
> status, emp_id, bill_per, label, log_file, debug_file, completed_date) 
> VALUES (:batch_id, :batch_type, :scheduled_date, :status, :emp_id, 
> :bill_per, :label, :log_file, :debug_file, :completed_date)'
> {b'log_file': None, b'status': 0, b'batch_type': 1, b'completed_date': 
> None, b'emp_id': 8329, b'scheduled_date': datetime.datetime(2015, 7, 28, 
> 11, 12, 43, 613744), b'label': 'Testing insert', b'debug_file': None, 
> b'bill_per': 201501, b'batch_id': 999999}
> <sqlalchemy.dialects.oracle.cx_oracle.OracleExecutionContext_cx_oracle 
> object at 0x7f7266e733c8>
> **********************************************************************
> 2015-07-28 11:12:43,669 INFO sqlalchemy.engine.base.Engine ROLLBACK
> Traceback (most recent call last):
>   File 
> "/home/rternosky/src/git/pluto/venv/lib/python3.4/site-packages/sqlalchemy/engine/base.py",
>  
> line 1139, in _execute_context
>     context)
>   File 
> "/home/rternosky/src/git/pluto/venv/lib/python3.4/site-packages/sqlalchemy/engine/default.py",
>  
> line 456, in do_execute
>     cursor.execute(statement, parameters)
> cx_Oracle.IntegrityError: ORA-01400: cannot insert NULL into 
> ("CORP"."TEST_TABLE"."BILL_PER")
>
>
> The above exception was the direct cause of the following exception:
>
> Traceback (most recent call last):
>   File "isolated.py", line 68, in <module>
>     result = conn.execute(ins)
>   File 
> "/home/rternosky/src/git/pluto/venv/lib/python3.4/site-packages/sqlalchemy/engine/base.py",
>  
> line 914, in execute
>     return meth(self, multiparams, params)
>   File 
> "/home/rternosky/src/git/pluto/venv/lib/python3.4/site-packages/sqlalchemy/sql/elements.py",
>  
> line 323, in _execute_on_connection
>     return connection._execute_clauseelement(self, multiparams, params)
>   File 
> "/home/rternosky/src/git/pluto/venv/lib/python3.4/site-packages/sqlalchemy/engine/base.py",
>  
> line 1010, in _execute_clauseelement
>     compiled_sql, distilled_params
>   File 
> "/home/rternosky/src/git/pluto/venv/lib/python3.4/site-packages/sqlalchemy/engine/base.py",
>  
> line 1146, in _execute_context
>     context)
>   File 
> "/home/rternosky/src/git/pluto/venv/lib/python3.4/site-packages/sqlalchemy/engine/base.py",
>  
> line 1341, in _handle_dbapi_exception
>     exc_info
>   File 
> "/home/rternosky/src/git/pluto/venv/lib/python3.4/site-packages/sqlalchemy/util/compat.py",
>  
> line 188, in raise_from_cause
>     reraise(type(exception), exception, tb=exc_tb, cause=exc_value)
>   File 
> "/home/rternosky/src/git/pluto/venv/lib/python3.4/site-packages/sqlalchemy/util/compat.py",
>  
> line 181, in reraise
>     raise value.with_traceback(tb)
>   File 
> "/home/rternosky/src/git/pluto/venv/lib/python3.4/site-packages/sqlalchemy/engine/base.py",
>  
> line 1139, in _execute_context
>     context)
>   File 
> "/home/rternosky/src/git/pluto/venv/lib/python3.4/site-packages/sqlalchemy/engine/default.py",
>  
> line 456, in do_execute
>     cursor.execute(statement, parameters)
> sqlalchemy.exc.IntegrityError: (cx_Oracle.IntegrityError) ORA-01400: 
> cannot insert NULL into ("CORP"."TEST_TABLE"."BILL_PER")
>  [SQL: b'INSERT INTO corp.test_table (batch_id, batch_type, 
> scheduled_date, status, emp_id, bill_per, label, log_file, debug_file, 
> completed_date) VALUES (:batch_id, :batch_type, :scheduled_date, :status, 
> :emp_id, :bill_per, :label, :log_file, :debug_file, :completed_date)'] 
> [parameters: {b'log_file': None, b'status': 0, b'batch_type': 1, 
> b'completed_date': None, b'emp_id': 8329, b'scheduled_date': 
> datetime.datetime(2015, 7, 28, 11, 12, 43, 613744), b'label': 'Testing 
> insert', b'debug_file': None, b'bill_per': 201501, b'batch_id': 999999}]
>
>
>  -- 
> 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] <javascript:>.
> To post to this group, send email to [email protected] 
> <javascript:>.
> Visit this group at http://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/d/optout.
>
>
>  

-- 
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 http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to