On Wednesday, June 13, 2018 at 8:28:32 PM UTC-4, Mike Bayer wrote: > > On Wed, Jun 13, 2018 at 7:44 PM, Peter Lai <pete...@pw.utc.com > <javascript:>> wrote: > > I've implemented a Concrete inheritance model and Oracle 11g is balking > on > > `CAST(NULL AS CLOB) as fieldn` during the pjoin union query execution > with: > > > > ORA-00932: inconsistent datatypes: expected - got CLOB > > > > This happens when the unioned tables representing the 2 subclasses have > > different `Text` fields which are created as CLOBs on Oracle. This is > > independent of cxOracle version, since we get the same problem running > the > > emitted query in native Oracle SQL Developer: > > > > `select cast(null as clob) from dual` > > > > ORA-00932: inconsistent datatypes: expected - got CLOB > > 00932. 00000 - "inconsistent datatypes: expected %s got %s" > > *Cause: > > *Action: > > Error at Line: 1 Column: 8 > > > > The rest of the CASTs of NULL work fine, though, but generally NULL > columns > > should have no datatype in Oracle via NULL definition. I am on > SQLAlchemy > > 1.1.3. Does 1.2x handle this better? If yes, and I need to hotpatch, > which > > lines would I need to patch? > > just turn them off: > > > http://docs.sqlalchemy.org/en/rel_1_1/orm/mapping_api.html?highlight=polymorphic_union#sqlalchemy.orm.util.polymorphic_union.params.cast_nulls > > > cast_nulls¶ – if True, non-existent columns, which are represented as > labeled NULLs, will be passed into CAST. This is a legacy behavior > that is problematic on some backends such as Oracle - in which case it > can be set to False. > > Cool! However, I used/ am using AbstractConcreteBase for this and apparently my inheritance-foo isn't good enough to avoid completely copy-pasting a whole bunch of code from sqlalchemy.ext.declarative.api just to override _create_polymorphic_union(). I tried to create a class that inherits from AbstractConcreteBase for a simple override and I got a bunch of `sqlalchemy.exc.ArgumentError: Mapper 'Mapper|FooBase|None' does not have a mapped_table specified.` errors:
Base = declarative_base() class AbstractConcreteBase_ORA(AbstractConcreteBase): # override polymorphic union because of Oracle @classmethod def _create_polymorphic_union(cls, mappers): return polymorphic_union(OrderedDict( (mp.polymorphic_identity, mp.local_table) for mp in mappers ), 'type', 'pjoin', False) class FooBase(AbstractConcreteBase_ORA, Base): common = Column(Integer, primary_key=True) class Foo(FooBase, Base): noncommon = Column(Text) __mapper_args__ = { 'polymorphic_identity': 'foo', 'concrete': True } class Bar(FooBase, Base): noncommon2 = Column(Text) __mapper_args__ = { 'polymorphic_identity': 'bar', 'concrete': True } -- SQLAlchemy - The Python SQL Toolkit and Object Relational Mapper http://www.sqlalchemy.org/ To post example code, please provide an MCVE: Minimal, Complete, and Verifiable Example. See http://stackoverflow.com/help/mcve for a full description. --- 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.