甲骨文公司¶

Support for the Oracle database.

数据库接口支持

The following dialect/DBAPI options are available. Please refer to individual DBAPI sections for connect information.

连接参数

方言支持几种 create_engine() 影响方言行为的参数,而不考虑使用的驱动程序。

自动增量行为

包含整数主键的SQLAlchemy表对象通常假定具有“自动增量”行为,这意味着它们可以在插入时生成自己的主键值。由于Oracle没有“autoincrement”特性,因此SQLAlchemy依赖序列来生成这些值。用甲骨文方言, 必须始终显式指定序列才能启用自动增量 . 这与大多数文档示例不同,这些文档示例假定使用具有自动增量功能的数据库。要指定序列,请使用传递给列构造的sqlachemy.schema.sequence对象::

t = Table('mytable', metadata,
      Column('id', Integer, Sequence('id_seq'), primary_key=True),
      Column(...), ...
)

使用表反射时,也需要执行此步骤,即autoload=true::

t = Table('mytable', metadata,
      Column('id', Integer, Sequence('id_seq'), primary_key=True),
      autoload=True
)

标识符大小写

在Oracle中,数据字典使用大写文本表示所有不区分大小写的标识符名称。另一方面,SQLAlchemy认为所有小写标识符名称都不区分大小写。在模式级通信期间,Oracle方言将所有不区分大小写的标识符转换为这两种格式,例如表和索引的反射。在sqlAlchemy端使用大写名称表示区分大小写的标识符,sqlAlchemy将引用该名称-这将导致与从Oracle接收的数据字典数据不匹配,因此,除非标识符名称真正创建为区分大小写(即使用带引号的名称),否则所有小写名称都应在sqlAlchemy上使用。一边。

极限/偏移支撑

Oracle不支持limit或offset关键字。SQLAlchemy将包装的子查询方法与rowNum结合使用。具体方法见http://www.oracle.com/technetwork/issue-archive/2006/06-sep/o56asktom-086197.html。

有两个选项会影响其行为:

当使用完全不同的窗口查询方法(即row_number()over(order by))提供限制/偏移量时,一些用户报告了更好的性能(请注意,大多数用户没有观察到这一点)。为了适应这种情况,可以完全替换用于限制/偏移的方法。请参阅http://www.sqlacchemy.org/trac/wiki/usagerecipes/windowfunctionsbydefault中的方法,该方法安装一个选择编译器,用一个窗口函数覆盖限制/偏移量的生成。

返回支持

Oracle数据库支持有限的返回形式,以便从insert、update和delete语句中检索匹配行的结果集。Oracle的返回..in to语法只支持返回一行,因为它依赖out参数才能运行。此外,受支持的DBAPI还有进一步的限制(请参见 返回支持

SQLAlchemy的“隐式返回”功能通常在Oracle后端启用,它使用在insert中返回,有时还使用update语句来获取新生成的主键值和其他SQL默认值和表达式。默认情况下,“隐式返回”通常只获取单个 nextval(some_seq) 嵌入到insert中的表达式,以便在insert语句中增加序列并同时返回值。要全面禁用此功能,请指定 implicit_returning=Falsecreate_engine() ::

engine = create_engine("oracle://scott:tiger@dsn",
                       implicit_returning=False)

隐式返回也可以作为表选项逐个表禁用:

# Core Table
my_table = Table("my_table", metadata, ..., implicit_returning=False)


# declarative
class MyClass(Base):
    __tablename__ = 'my_table'
    __table_args__ = {"implicit_returning": False}

参见

返回支持 -对隐式返回的其他cx_Oracle特定限制。

更新层叠时

Oracle没有本机更新级联功能。基于触发器的解决方案可在http://asktom.oracle.com/tkyte/update_cascade/index.html上找到。

使用SQLAlchemy ORM时,ORM手动发出级联更新的能力有限-使用“deferrable=true,initially='deferred'”关键字参数指定foreignkey对象,并在每个关系()上指定“passive_updates=false”。

Oracle 8兼容性

当检测到Oracle 8时,方言在内部将自身配置为以下行为:

约束反射

Oracle方言可以返回有关外键、唯一和检查约束以及表上索引的信息。

有关这些约束的原始信息可以使用 Inspector.get_foreign_keys()Inspector.get_unique_constraints()Inspector.get_check_constraints()Inspector.get_indexes() .

在 1.2 版更改: Oracle方言现在可以反映唯一和检查约束。

使用反射时 Table 水平 Table 还将包括这些约束。

注意以下注意事项:

带有系统/系统辅助表空间的表名

这个 Inspector.get_table_names()Inspector.get_temp_table_names() 方法分别返回当前引擎的表名列表。这些方法也是操作中发生的反射的一部分,例如 MetaData.reflect() . 默认情况下,这些操作不包括 SYSTEMSYSAUX 操作中的表空间。为了更改此设置,可以在引擎级别使用 exclude_tablespaces 参数::

# exclude SYSAUX and SOME_TABLESPACE, but not SYSTEM
e = create_engine(
  "oracle://scott:tiger@xe",
  exclude_tablespaces=["SYSAUX", "SOME_TABLESPACE"])

1.1 新版功能.

日期时间兼容性

Oracle没有已知的数据类型 DATETIME 相反,它只有 DATE ,它实际上可以存储日期和时间值。因此,Oracle方言提供了 oracle.DATE 它是 DateTime . 此类型没有特殊行为,并且仅作为此类型的“标记”存在;此外,当数据库列被反映并且该类型被报告为 DATE ,时间支持 oracle.DATE 使用类型。

在 0.9.4 版更改: 补充 oracle.DATE 子类 DateTime . 这是一个更改,因为以前的版本将反映 DATE 列为 types.DATE ,哪个子类 Date . 这里唯一的意义是,对于正在检查列类型的方案,这些列用于特殊的Python翻译或用于将模式迁移到其他数据库后端。

Oracle表选项

create table短语与Oracle一起支持以下选项 Table 构建:

1.0.0 新版功能.

1.0.0 新版功能.

Oracle特定索引选项

位图索引

您可以指定 oracle_bitmap 创建位图索引而不是B树索引的参数:

Index('my_index', my_table.c.data, oracle_bitmap=True)

位图索引不能是唯一的,也不能压缩。SQLAlchemy不会检查这样的限制,只有数据库会检查。

1.0.0 新版功能.

索引压缩

对于包含大量重复值的索引,Oracle具有更高效的存储模式。使用 oracle_compress 打开密钥压缩的参数:

Index('my_index', my_table.c.data, oracle_compress=True)

Index('my_index', my_table.c.data1, my_table.c.data2, unique=True,
       oracle_compress=1)

这个 oracle_compress 参数接受指定要压缩的前缀列数的整数,或者 True 使用默认值(非唯一索引的所有列,唯一索引的最后一列除外)。

1.0.0 新版功能.

Oracle数据类型

与所有的sqlAlchemy方言一样,已知对Oracle有效的所有大写类型都可以从顶级方言导入,无论它们是否源自 sqlalchemy.types 或者来自当地方言:

from sqlalchemy.dialects.oracle import \
            BFILE, BLOB, CHAR, CLOB, DATE, \
            DOUBLE_PRECISION, FLOAT, INTERVAL, LONG, NCLOB, NCHAR, \
            NUMBER, NVARCHAR, NVARCHAR2, RAW, TIMESTAMP, VARCHAR, \
            VARCHAR2

1.2.19 新版功能: 补充 NCHAR 到Oracle方言导出的数据类型列表。

特定于Oracle或具有Oracle特定构造参数的类型如下:

class sqlalchemy.dialects.oracle.BFILE(length=None)

基地: sqlalchemy.types.LargeBinary

__init__(length=None)

继承 __init__() 方法 LargeBinary

构造一个大二进制类型。

参数

length -- 可选,用于ddl语句中的列的长度,用于接受长度的二进制类型,例如mysql blob类型。

class sqlalchemy.dialects.oracle.DATE(timezone=False)

基地: sqlalchemy.types.DateTime

提供Oracle日期类型。

此类型没有特殊的python行为,只是它的子类 types.DateTime 这是为了适应甲骨文 DATE 类型支持时间值。

0.9.4 新版功能.

__init__(timezone=False)

继承 __init__() 方法 DateTime

构建新的 DateTime .

参数

timezone -- 布尔函数。指示日期时间类型应启用时区支持(如果在 base date/time-holding type only . 建议使用 TIMESTAMP 当使用此标志时直接使用数据类型,因为某些数据库包含独立的通用日期/时间保持类型,这与支持时区的时间戳数据类型不同,例如Oracle。

class sqlalchemy.dialects.oracle.DOUBLE_PRECISION(precision=None, asdecimal=False, decimal_return_scale=None)

基地: sqlalchemy.types.Float

__init__(precision=None, asdecimal=False, decimal_return_scale=None)

继承 __init__() 方法 Float

构造一个浮点。

参数
  • precision -- 用于DDL的数字精度 CREATE TABLE .

  • asdecimal -- 与…相同的标志 Numeric ,但默认为 False . 请注意,将此标志设置为 True 导致浮点转换。

  • decimal_return_scale -- 从浮点转换为python小数时使用的默认小数位数。由于小数点不准确,浮点值通常要长得多,而且大多数浮点数据库类型没有“小数位数”的概念,因此默认情况下,浮点类型在转换时查找前十位小数。指定此值将覆盖该长度。注意,如果没有另外指定,mysql float类型(包括“scale”)将使用“scale”作为decimal_return_scale的默认值。…版本已添加::0.9.0

class sqlalchemy.dialects.oracle.INTERVAL(day_precision=None, second_precision=None)

基地: sqlalchemy.types.TypeEngine

__init__(day_precision=None, second_precision=None)

构造一个间隔。

请注意,目前只支持天到秒的间隔。这是由于在可用DBAPIS(cx_Oracle和zxjdbc)中缺少对年到月间隔的支持。

参数
  • day_precision -- 日精度值。这是要为“日”字段存储的位数。默认为“2”

  • second_precision -- 第二个精度值。这是为小数秒字段存储的位数。默认为“6”。

class sqlalchemy.dialects.oracle.NCLOB(length=None, collation=None, convert_unicode=False, unicode_error=None, _warn_on_bytestring=False, _expect_unicode=False)

基地: sqlalchemy.types.Text

__init__(length=None, collation=None, convert_unicode=False, unicode_error=None, _warn_on_bytestring=False, _expect_unicode=False)

继承 __init__() 方法 String

创建字符串保持类型。

参数
  • length -- 可选,用于DDL和CAST表达式的列的长度。如果没有,可以安全地省略 CREATE TABLE 将发布。某些数据库可能需要 length 在DDL中使用,并在 CREATE TABLE 如果 VARCHAR 不包括长度。该值是否解释为字节或字符是特定于数据库的。

  • collation -- 可选,用于DDL和CAST表达式的列级排序规则。使用sqlite、mysql和postgresql支持的collate关键字进行渲染。例如::>>>从sqlachemy import cast,select,string>>print select( [cast('some string', String(collation='utf8'))] )选择CAST(:param_1 as varchar collate utf8)as anon_1

  • convert_unicode -- 当设置为 True , the String 类型将假定输入将作为python 2下的python unicode对象传递,结果将作为python unicode对象返回。在DBAPI在python 2下不支持pythonUnicode的罕见情况下,sqlachemy将在字符串上使用自己的编码器/解码器功能,参考 create_engine.encoding 参数参数传递给 create_engine() 作为编码。…已弃用::1.3 String.convert_unicode 参数已弃用,将在将来的版本中删除。所有现代DBAPI现在都直接支持PythonUnicode,而这个参数是不必要的。对于极为罕见的情况,python unicode将由sqlachemy在后端进行编码/解码, does 本机支持python unicode,字符串值 "force" 可以在此处传递,这将导致无条件使用SQLAlchemy的编码/解码服务。…注意::SQLAlchemy的unicode转换标志和特性只适用于python 2;在python 3中,所有字符串对象都是unicode对象。出于这个原因,以及事实上,几乎所有现代DBAPI现在都支持Unicode,即使在Python2下, String.convert_unicode 标志本身就是一个遗留功能。…注:在绝大多数情况下, UnicodeUnicodeText 数据类型应用于 Column 它希望存储非ASCII数据。这些数据类型将确保在数据库端使用正确的类型,并在Python2下设置正确的Unicode行为。…参阅: create_engine.convert_unicode - Engine 宽参数

  • unicode_error -- 可选,用于处理Unicode转换错误的方法。表现得像 errors 标准库的关键字参数 string.decode() 函数,要求 String.convert_unicode 设置为 "force" …已弃用::1.3 String.unicode_errors 参数已弃用,将在将来的版本中删除。这个参数对于现代的python dbapis来说是不必要的,并且会显著降低性能。

class sqlalchemy.dialects.oracle.NUMBER(precision=None, scale=None, asdecimal=None)

基地: sqlalchemy.types.Numericsqlalchemy.types.Integer

__init__(precision=None, scale=None, asdecimal=None)

构造一个数字。

参数
  • precision -- 用于DDL的数字精度 CREATE TABLE .

  • scale -- DDL中使用的数字刻度 CREATE TABLE .

  • asdecimal -- 默认为真。返回值是否应作为python decimal对象或float发送。不同的dbapis根据数据类型发送一个或另一个-数字类型将确保返回值在dbapis中是一致的。

  • decimal_return_scale -- 从浮点转换为python小数时使用的默认小数位数。由于小数点不准确,浮点值通常要长得多,而且大多数浮点数据库类型都没有“小数位数”的概念,因此默认情况下,浮点类型在转换时查找前十位小数。指定此值将覆盖该长度。包含显式“.scale”值的类型,如基 Numeric 以及mysql float类型,将使用“.scale”值作为decimal_return_scale的默认值,如果没有另外指定。…添加的版本:0.9.0

当使用 Numeric 类型,应注意确保asdecimal设置适用于正在使用的dbapi-当numeric应用decimal->float或float->decimal的转换时,此转换会对收到的所有结果列产生额外的性能开销。

本地返回十进制(例如psycopg2)的dbapis在设置为 True ,因为本机十进制转换减少了浮点问题的数量,并且数字类型本身不需要应用任何进一步的转换。但是,另一个DBAPI以本机方式返回浮动 will 产生额外的转换开销,并且仍然会受到浮点数据丢失的影响-在这种情况下 asdecimal=False 将至少移除额外的转换开销。

class sqlalchemy.dialects.oracle.LONG(length=None, collation=None, convert_unicode=False, unicode_error=None, _warn_on_bytestring=False, _expect_unicode=False)

基地: sqlalchemy.types.Text

__init__(length=None, collation=None, convert_unicode=False, unicode_error=None, _warn_on_bytestring=False, _expect_unicode=False)

继承 __init__() 方法 String

创建字符串保持类型。

参数
  • length -- 可选,用于DDL和CAST表达式的列的长度。如果没有,可以安全地省略 CREATE TABLE 将发布。某些数据库可能需要 length 在DDL中使用,并在 CREATE TABLE 如果 VARCHAR 不包括长度。该值是否解释为字节或字符是特定于数据库的。

  • collation -- 可选,用于DDL和CAST表达式的列级排序规则。使用sqlite、mysql和postgresql支持的collate关键字进行渲染。例如::>>>从sqlachemy import cast,select,string>>print select( [cast('some string', String(collation='utf8'))] )选择CAST(:param_1 as varchar collate utf8)as anon_1

  • convert_unicode -- 当设置为 True , the String 类型将假定输入将作为python 2下的python unicode对象传递,结果将作为python unicode对象返回。在DBAPI在python 2下不支持pythonUnicode的罕见情况下,sqlachemy将在字符串上使用自己的编码器/解码器功能,参考 create_engine.encoding 参数参数传递给 create_engine() 作为编码。…已弃用::1.3 String.convert_unicode 参数已弃用,将在将来的版本中删除。所有现代DBAPI现在都直接支持PythonUnicode,而这个参数是不必要的。对于极为罕见的情况,python unicode将由sqlachemy在后端进行编码/解码, does 本机支持python unicode,字符串值 "force" 可以在此处传递,这将导致无条件使用SQLAlchemy的编码/解码服务。…注意::SQLAlchemy的unicode转换标志和特性只适用于python 2;在python 3中,所有字符串对象都是unicode对象。出于这个原因,以及事实上,几乎所有现代DBAPI现在都支持Unicode,即使在Python2下, String.convert_unicode 标志本身就是一个遗留功能。…注:在绝大多数情况下, UnicodeUnicodeText 数据类型应用于 Column 它希望存储非ASCII数据。这些数据类型将确保在数据库端使用正确的类型,并在Python2下设置正确的Unicode行为。…参阅: create_engine.convert_unicode - Engine 宽参数

  • unicode_error -- 可选,用于处理Unicode转换错误的方法。表现得像 errors 标准库的关键字参数 string.decode() 函数,要求 String.convert_unicode 设置为 "force" …已弃用::1.3 String.unicode_errors 参数已弃用,将在将来的版本中删除。这个参数对于现代的python dbapis来说是不必要的,并且会显著降低性能。

class sqlalchemy.dialects.oracle.RAW(length=None)

基地: sqlalchemy.types._Binary

__init__(length=None)

继承 __init__() 方法 _Binary

初始化自身。请参阅帮助(键入(self))以获得准确的签名。

cx_Oracle

Support for the Oracle database via the cx-Oracle driver.

DBAPI

Documentation and download information (if applicable) for cx-Oracle is available at: https://oracle.github.io/python-cx_Oracle/

Connecting

Connect String:

oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]

其他连接参数

当连接到 dbname 存在URL令牌, hostnameportdbname 令牌使用 cx_Oracle.makedsn() 功能。网址如下:

e = create_engine("oracle+cx_oracle://user:pass@hostname/dbname")

将用于创建DSN,如下所示:

>>> import cx_Oracle
>>> cx_Oracle.makedsn("hostname", 1521, sid="dbname")
'(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=hostname)(PORT=1521))(CONNECT_DATA=(SID=dbname)))'

这个 service_name 参数,也由 cx_Oracle.makedsn() 可以在URL查询字符串中指定,例如 ?service_name=my_service .

如果 dbname 不存在,则 hostname 在URL中直接用作传递给 cx_Oracle.connect() .

其他连接参数可以发送到 cx_Oracle.connect() 函数使用 create_engine.connect_args 字典。可以传递任何cx_Oracle参数值和/或常量,例如:

import cx_Oracle
e = create_engine(
    "oracle+cx_oracle://user:pass@dsn",
    connect_args={
        "mode": cx_Oracle.SYSDBA,
        "events": True
    }
)

或者,大多数cx-oracle dbapi参数也可以在url中编码为字符串,其中包括参数,例如 modepurityeventsthreaded 及其他:

e = create_engine(
    "oracle+cx_oracle://user:pass@dsn?mode=SYSDBA&events=true")

在 1.3 版更改: cx-oracle方言现在接受URL字符串本身中的所有参数名,并将其传递给cx-oracle dbapi。如前所述,但没有正确记录, create_engine.connect_args 参数还接受所有cx_oracle dbapi connect参数。

还有一些选项被SQLAlchemy cx_Oracle方言本身所使用。这些选项总是直接传递给 create_engine() ,例如:

e = create_engine(
    "oracle+cx_oracle://user:pass@dsn", coerce_to_unicode=False)

cx_Oracle方言接受的参数如下:

  • arraysize -在光标上设置cx_oracle.arraysize值,默认值为50。对于cx_oracle,此设置非常重要,因为lob对象的内容只能在“活动”行中读取(例如,在一批50行中)。

  • auto_convert_lobs -默认为true;请参见 目标对象 .

  • coerce_to_unicode -见 统一码 细节。

  • coerce_to_decimal -见 精确数字 细节。

统一码

从版本5开始的cx-oracle dbapi完全支持unicode,并且能够以python-unicode对象的形式返回字符串结果。

通过使用 Unicode 具有SQLAlchemy核心表达式语言的数据类型,以及 UnicodeText 数据类型。默认情况下,这些类型对应于varchar2和clob-oracle数据类型。在将这些数据类型与Unicode数据一起使用时,Oracle数据库应配置有Unicode意识字符集,以及 NLS_LANG 环境变量被适当地设置,以便varchar2和clob数据类型能够容纳数据。

如果Oracle数据库未配置Unicode字符集,则两个选项将使用 oracle.NCHARoracle.NCLOB 显式的数据类型,或传递标志 use_nchar_for_unicode=Truecreate_engine() ,这将导致sqlAlchemy方言将nchar/nclob用于 Unicode / UnicodeText 数据类型,而不是varchar/clob。

在 1.3 版更改: 这个 UnicodeUnicodeText 数据类型现在对应于 VARCHAR2CLOB Oracle数据类型,除非 use_nchar_for_unicode=Truecreate_engine() 被称为。

当获取包含字符串的结果集时,在python 3下,cx_Oracle DBAPI将所有字符串作为python unicode对象返回,因为python 3只有unicode字符串类型。对于从varchar2、char、clob、nchar、nclob等数据类型中提取的数据,会发生这种情况。为了在python 2下提供交叉兼容性,sqlachemy cx_oracle方言也会将unicode转换添加到python 2下的字符串数据中。历史上,这使用了由cx_oracle提供但被发现没有性能的转换器;sqlAlchemy自己的转换器用于python 2下的字符串到unicode转换。要禁用varchar2、char和clob的python 2 unicode转换,标志 coerce_to_unicode=False 可以传递给 create_engine() .

在 1.3 版更改: 在python 2下,默认情况下,Unicode转换应用于所有字符串值。这个 coerce_to_unicode 现在默认为true,可以设置为false以禁用以varchar2/char/clob数据形式传递的字符串的Unicode强制。

通过setinputsizes对cx_Oracle数据绑定性能的细粒度控制

cx-oracle dbapi对dbapi的使用有着深刻而基本的依赖性 setinputsizes() 调用。此调用的目的是为作为参数传递的python值建立绑定到SQL语句的数据类型。实际上没有其他DBAPI为 setinputsizes() 调用时,cx-oracle dbapi在与Oracle客户机接口的交互中非常依赖于它,在某些情况下,sqlAlchemy不可能确切地知道应该如何绑定数据,因为某些设置可能会导致性能特征极为不同,同时改变类型强制行为。

cx-oracle方言的用户是 强烈鼓励 要阅读cx-oracle的内置数据类型符号列表,请访问http://cx-oracle.readthedocs.io/en/latest/module.html types。请注意,在某些情况下,当使用这些类型与不使用时,特别是在指定 cx_Oracle.CLOB .

在SQLAlchemy方面, DialectEvents.do_setinputsizes() 事件既可用于setinputsizes步骤的运行时可见性(例如日志记录),也可用于完全控制 setinputsizes() 按语句使用。

1.2.9 新版功能: 补充 DialectEvents.setinputsizes()

示例1-记录所有setinputsizes调用

下面的示例说明如何在将中间值转换为原始值之前,从SQLAlchemy的角度记录它们。 setinputsizes() 参数字典。字典的关键是 BindParameter 具有 .key 和A .type 属性:

from sqlalchemy import create_engine, event

engine = create_engine("oracle+cx_oracle://scott:tiger@host/xe")

@event.listens_for(engine, "do_setinputsizes")
def _log_setinputsizes(inputsizes, cursor, statement, parameters, context):
    for bindparam, dbapitype in inputsizes.items():
            log.info(
                "Bound parameter name: %s  SQLAlchemy type: %r  "
                "DBAPI object: %s",
                bindparam.key, bindparam.type, dbapitype)

示例2-删除到CLOB的所有绑定

这个 CLOB cx_oracle中的数据类型会产生很大的性能开销,但是默认情况下会为 Text 在SQLAlchemy 1.2系列中键入。此设置可以修改如下:

from sqlalchemy import create_engine, event
from cx_Oracle import CLOB

engine = create_engine("oracle+cx_oracle://scott:tiger@host/xe")

@event.listens_for(engine, "do_setinputsizes")
def _remove_clob(inputsizes, cursor, statement, parameters, context):
    for bindparam, dbapitype in list(inputsizes.items()):
        if dbapitype is CLOB:
            del inputsizes[bindparam]

返回支持

cx_Oracle方言实现使用out参数返回。方言支持完全返回,但建议使用cx_oracle 6以获得完全支持。

目标对象

cx_oracle使用cx_oracle.lob对象返回Oracle LOB。sqlAlchemy将这些转换为字符串,以便二进制类型的接口与其他后端的接口一致,后者发生在cx_Oracle OutputTypeHandler中。

cx_Oracle在版本6之前将要求在读取新批行之前读取lob对象,这由 cursor.arraysize . 从6系列开始,此限制已解除。不过,由于SQLAlchemy预先读取这些LOB,所以无论如何都可以避免这个问题。

要禁用方言的自动“read()”功能,标志 auto_convert_lobs=False 可传递给 create_engine() . 在cx-oracle 5系列中,关闭此标志意味着如果在提取过时的lob对象时不读取它,则有可能读取该对象。使用cx_Oracle 6,可以解决此问题。

在 1.2 版更改: LOB处理系统在内部被大大简化以使用outputtypehanders,不再使用备用的“缓冲”结果集对象。

不支持两阶段事务

两阶段交易是 不支持 在cx_Oracle下,由于驱动程序支持不佳。从cx_oracle 6.0b1开始,两阶段事务的接口已更改为更直接地传递到底层OCI层,自动化程度更低。支持此系统的附加逻辑未在SQLAlchemy中实现。

精确数字

sqlAlchemy的numeric类型可以像python那样处理接收和返回值 Decimal 对象或浮动对象。当A Numeric 对象或子类,如 Floatoracle.DOUBLE_PRECISION 等正在使用中, Numeric.asdecimal 标志确定是否应将值强制为 Decimal 返回时,或作为浮动对象返回。为了使甲骨文下的事情更加复杂,甲骨文的 NUMBER 如果“scale”为零,类型还可以表示整数值,因此Oracle特定 oracle.NUMBER 类型也考虑到这一点。

cx-oracle方言广泛使用连接级和光标级的“outputtypehander”可调用文件,以便按要求强制使用数值。这些可调用物是特定于 Numeric 在使用中,以及如果不存在任何SQLAlchemy类型对象。在观察到的情况下,Oracle可能会发送有关返回的数字类型的不完整或不明确的信息,例如,将数字类型隐藏在多个级别的子查询下的查询。类型处理程序在所有情况下都尽其所能做出正确的决策,对于驱动程序能够做出最佳决策的所有情况,都遵从底层的cx_Oracle DBAPI。

当没有输入对象时,如执行普通的SQL字符串时,会出现一个默认的“outputTypeHandler”,它通常会返回指定精度和比例为python的数值。 Decimal 对象。若要出于性能原因禁用强制小数,请传递标志 coerce_to_decimal=Falsecreate_engine() ::

engine = create_engine("oracle+cx_oracle://dsn", coerce_to_decimal=False)

这个 coerce_to_decimal 标记只影响普通字符串SQL语句的结果,这些语句在其他方面与 Numeric SQLAlchemy类型(或此类子类)。

在 1.2 版更改: cx_-oracle的数字处理系统已经重新设计,以利用新的cx_-oracle功能以及更好地集成输出类型处理程序。

ZXJDBC

Support for the Oracle database via the zxJDBC for Jython driver.

注解

当前版本的SQLAlchemy不支持Jython。zxjdbc方言应被视为实验性方言。

DBAPI

Drivers for this database are available at: http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html

Connecting

Connect String:

oracle+zxjdbc://user:pass@host/dbname