Support for the Oracle database.
The following dialect/DBAPI options are available. Please refer to individual DBAPI sections for connect information.
方言支持几种 create_engine()
影响方言行为的参数,而不考虑使用的驱动程序。
use_ansi
-使用ansi-join构造(请参见Oracle8部分)。默认为 True
. 如果 False
,Oracle-8兼容结构用于联接。
optimize_limits
-默认为 False
. 请参见“限制/偏移”部分。
use_binds_for_limits
-默认为 True
. 请参见“限制/偏移”部分。
包含整数主键的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。
有两个选项会影响其行为:
默认情况下不使用“first rows()”优化关键字。要启用此优化指令的使用,请指定 optimize_limits=True
到 create_engine()
.
为限制/偏移传递的值将作为绑定参数发送。一些用户观察到,当值以绑定方式发送而不是逐字呈现时,Oracle会生成一个糟糕的查询计划。要在SQL语句中逐字呈现限制/偏移值,请指定 use_binds_for_limits=False
到 create_engine()
.
当使用完全不同的窗口查询方法(即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=False
到 create_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时,方言在内部将自身配置为以下行为:
当对表对象使用反射时,方言可以通过传递标志来选择性地搜索由同义词表示的表,无论是在本地模式还是远程模式中,还是通过dblink访问的表。 oracle_resolve_synonyms=True
作为关键字参数 Table
结构:
some_table = Table('some_table', autoload=True,
autoload_with=some_engine,
oracle_resolve_synonyms=True)
设置此标志时,给定的名称(例如 some_table
将不仅仅在 ALL_TABLES
视图,但也在 ALL_SYNONYMS
查看此名称是否实际上是其他名称的同义词。如果同义词位于并引用dblink,则Oracle方言知道如何使用dblink语法(例如 @dblink
)
oracle_resolve_synonyms
在接受反射参数的地方接受,包括 MetaData.reflect()
和 Inspector.get_columns()
.
如果同义词未使用,则应禁用此标志。
Oracle方言可以返回有关外键、唯一和检查约束以及表上索引的信息。
有关这些约束的原始信息可以使用 Inspector.get_foreign_keys()
, Inspector.get_unique_constraints()
, Inspector.get_check_constraints()
和 Inspector.get_indexes()
.
在 1.2 版更改: Oracle方言现在可以反映唯一和检查约束。
使用反射时 Table
水平 Table
还将包括这些约束。
注意以下注意事项:
当使用 Inspector.get_check_constraints()
方法,Oracle为指定“not null”的列生成一个特殊的“is not null”约束。这个约束是 not 默认情况下返回;要包含“is not null”约束,请传递标志 include_all=True
::
from sqlalchemy import create_engine, inspect
engine = create_engine("oracle+cx_oracle://s:t@dsn")
inspector = inspect(engine)
all_check_constraints = inspector.get_check_constraints(
"some_table", include_all=True)
在大多数情况下,当反映 Table
,唯一约束将 not 可作为 UniqueConstraint
对象,因为在大多数情况下,Oracle使用唯一索引来镜像唯一约束(当两个或多个唯一约束表示同一列时似乎是例外); Table
而是用 Index
与 unique=True
标志集。
Oracle为表的主键创建隐式索引;此索引是 排除 从所有索引结果。
为索引反映的列列表将不包括以sys_nc开头的列名称。
这个 Inspector.get_table_names()
和 Inspector.get_temp_table_names()
方法分别返回当前引擎的表名列表。这些方法也是操作中发生的反射的一部分,例如 MetaData.reflect()
. 默认情况下,这些操作不包括 SYSTEM
和 SYSAUX
操作中的表空间。为了更改此设置,可以在引擎级别使用 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翻译或用于将模式迁移到其他数据库后端。
create table短语与Oracle一起支持以下选项 Table
构建:
ON COMMIT
::
Table(
"some_table", metadata, ...,
prefixes=['GLOBAL TEMPORARY'], oracle_on_commit='PRESERVE ROWS')
1.0.0 新版功能.
COMPRESS
::
Table('mytable', metadata, Column('data', String(32)),
oracle_compress=True)
Table('mytable', metadata, Column('data', String(32)),
oracle_compress=6)
The ``oracle_compress`` parameter accepts either an integer compression
level, or ``True`` to use the default compression level.
1.0.0 新版功能.
您可以指定 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 新版功能.
与所有的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特定构造参数的类型如下:
sqlalchemy.dialects.oracle.
BFILE
(length=None)¶基地: sqlalchemy.types.LargeBinary
__init__
(length=None)¶继承 __init__()
方法 LargeBinary
构造一个大二进制类型。
length¶ -- 可选,用于ddl语句中的列的长度,用于接受长度的二进制类型,例如mysql blob类型。
sqlalchemy.dialects.oracle.
DATE
(timezone=False)¶提供Oracle日期类型。
此类型没有特殊的python行为,只是它的子类 types.DateTime
这是为了适应甲骨文 DATE
类型支持时间值。
0.9.4 新版功能.
sqlalchemy.dialects.oracle.
DOUBLE_PRECISION
(precision=None, asdecimal=False, decimal_return_scale=None)¶__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
sqlalchemy.dialects.oracle.
INTERVAL
(day_precision=None, second_precision=None)¶sqlalchemy.dialects.oracle.
NCLOB
(length=None, collation=None, convert_unicode=False, unicode_error=None, _warn_on_bytestring=False, _expect_unicode=False)¶__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
标志本身就是一个遗留功能。…注:在绝大多数情况下, Unicode
或 UnicodeText
数据类型应用于 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来说是不必要的,并且会显著降低性能。
sqlalchemy.dialects.oracle.
NUMBER
(precision=None, scale=None, asdecimal=None)¶基地: sqlalchemy.types.Numeric
, sqlalchemy.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
将至少移除额外的转换开销。
sqlalchemy.dialects.oracle.
LONG
(length=None, collation=None, convert_unicode=False, unicode_error=None, _warn_on_bytestring=False, _expect_unicode=False)¶__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
标志本身就是一个遗留功能。…注:在绝大多数情况下, Unicode
或 UnicodeText
数据类型应用于 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来说是不必要的,并且会显著降低性能。
Support for the Oracle database via the cx-Oracle driver.
Documentation and download information (if applicable) for cx-Oracle is available at: https://oracle.github.io/python-cx_Oracle/
当连接到 dbname
存在URL令牌, hostname
, port
和 dbname
令牌使用 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中编码为字符串,其中包括参数,例如 mode
, purity
, events
, threaded
及其他:
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方言接受的参数如下:
从版本5开始的cx-oracle dbapi完全支持unicode,并且能够以python-unicode对象的形式返回字符串结果。
通过使用 Unicode
具有SQLAlchemy核心表达式语言的数据类型,以及 UnicodeText
数据类型。默认情况下,这些类型对应于varchar2和clob-oracle数据类型。在将这些数据类型与Unicode数据一起使用时,Oracle数据库应配置有Unicode意识字符集,以及 NLS_LANG
环境变量被适当地设置,以便varchar2和clob数据类型能够容纳数据。
如果Oracle数据库未配置Unicode字符集,则两个选项将使用 oracle.NCHAR
和 oracle.NCLOB
显式的数据类型,或传递标志 use_nchar_for_unicode=True
到 create_engine()
,这将导致sqlAlchemy方言将nchar/nclob用于 Unicode
/ UnicodeText
数据类型,而不是varchar/clob。
在 1.3 版更改: 这个 Unicode
和 UnicodeText
数据类型现在对应于 VARCHAR2
和 CLOB
Oracle数据类型,除非 use_nchar_for_unicode=True
当 create_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强制。
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()
下面的示例说明如何在将中间值转换为原始值之前,从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)
这个 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
对象或子类,如 Float
, oracle.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=False
到 create_engine()
::
engine = create_engine("oracle+cx_oracle://dsn", coerce_to_decimal=False)
这个 coerce_to_decimal
标记只影响普通字符串SQL语句的结果,这些语句在其他方面与 Numeric
SQLAlchemy类型(或此类子类)。
Support for the Oracle database via the zxJDBC for Jython driver.
注解
当前版本的SQLAlchemy不支持Jython。zxjdbc方言应被视为实验性方言。
Drivers for this database are available at: http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html