我有一个oracle数据类型列表(其中有数百个),我想以编程方式映射到SQLAlchemy数据类型。
以下是一些示例oracle数据类型(包括许多其他数据类型):
XMLTYPE
VARCHAR2
UROWID
URITYPE
UNDEFINED
TIMESTAMP(9)
我正在从oracle查询数据到pandas数据框,然后使用sql alchemy将数据加载到另一个系统。但是,我需要指定目标系统中的目标数据类型。(由于批处理了ETL流程,仅使用数据框默认设置无效;第一批值可能会“误导”数据类型。)
这是SQLAlchemy数据类型的列表,我需要将oracle数据类型映射到sqlalchemy的数据类型。除了手动构造这样的字典之外,还有别的优雅的方法吗?
编辑:我给的具体示例数据类型并不重要。我宁愿以编程方式动态地将Oracle中的任意列分配给正确的SQLAlchemy数据类型。数据类型是对
SELECT
DISTINCT data_type
FROM
all_tab_columns;
返回的值超过150。因此,我真的希望避免手动查找每个文档。
该XMLTYPE
数据类型getStringVal
和getClobVal
方法(取决于内容的长度),可以使用提取这将只是一个字符串值,可以使用XML内容sqlalchemy.types.Text
(调用后getClobVal
法)。
VARCHAR2
只是一个可变长度的字符串。Oracle没有VARCHAR
数据类型,它是等效的(VARCHAR
当前是的同义词VARCHAR2
)。等效为sqlalchemy.types.String
。
UROWID
记录为:
数据库中的每一行都有一个地址。但是,某些表的行所具有的地址不是物理的或永久的,也不是由Oracle数据库生成的。例如,索引组织表的行地址存储在可以移动的索引叶中。外部表(例如,通过网关访问的DB2表)的Rowid不是标准的Oracle Rowid。
Oracle使用通用rowid(urowids)存储索引组织表和外部表的地址。索引组织的表具有逻辑urowid,而外部表具有外部urowid。两种类型的urowid都存储在
ROWID
伪列中(堆组织表的物理行标识符也是如此)。
将UROWID
外部数据库持久化是没有意义的,因为它所表示的数据可能不是永久的并且可能会移动,即使它不移动,它也仅表示内存位置,而不表示任何实际数据。
URITYPE
代表URI
另一个资源,您可以使用其getURL
方法获取它代表的URI,该URI应该只是一个字符串值。等效的数据类型为sqlalchemy.types.String
or sqlalchemy.types.Text
(在调用getURL
方法以获取字符串表示形式之后)。
UNDEFINED
不是数据类型。您应该检查是否有人创建了名为的用户定义类型UNDEFINED
。
TIMESTAMP(9)
只是TIMESTAMP
精度为9
十进制秒的数字。在文档中,您似乎需要sqlalchemy.dialects.oracle.DATE
。
数据类型是对
SELECT DISTINCT data_type FROM all_tab_columns;
请不要依赖此列表,因为它包括*SYS
模式表中使用的所有数据类型,并且您不应触摸其中的大多数表,因为更改它们可能会导致无法预料的后果(包括使数据库无法使用)。
这些数据类型中的大多数将成为在数据库内部工作中使用的私有数据类型。您可以确定它们,因为它们通常$
在类型名称中都有一个。下一个最常见的分组将是SDO geometry数据类型,这些都有SDO_
前缀。
因此,如果您的查询变为:
SELECT CASE
WHEN data_type LIKE '%$%' THEN 'Private Type'
WHEN data_type LIKE 'SDO_%' THEN 'SDO Geometry Type'
ELSE data_type
END AS data_type,
COUNT( DISTINCT data_type ) AS num_instances
FROM all_tab_columns
GROUP BY
CASE
WHEN data_type LIKE '%$%' THEN 'Private Type'
WHEN data_type LIKE 'SDO_%' THEN 'SDO Geometry Type'
ELSE data_type
END
ORDER BY num_instances DESC, data_type ASC;
然后,在db <> fiddle上,您将获得以下输出,其中用户生成的表为零(因此仅适用于系统生成的表):
DATA_TYPE | NUM_INSTANCES :--------------------------- | ------------: 私有类型| 130 SDO几何类型| 5 ANYDATA | 1个 BINARY_DOUBLE | 1 BLOB | 1个 字符| 1 CLOB | 1 DATE | 1个 DS_VARRAY_4_CLOB | 1 FLOAT | 1 HSBLKNAMLST | 1 HSBLKVALARY | 1个 间隔天(3)至第二(0)| 1 间隔天(3)至第二(2)| 1 间隔天(9)至第二(6)| 1 长| 1 长RAW | 1 NUMBER | 1个 NVARCHAR2 | 1 RAW | 1 ROWID | 1 TIMESTAMP(0)| 1 TIMESTAMP(3)| 1 TIMESTAMP(6)| 1个带时区的 TIMESTAMP(6)| 1 TIMESTAMP(9)| 1个 未定义| 1个 VARCHAR2 | 1个 XMLTYPE | 1个
在162种数据类型中,有130种是私有的,另外5种是SDO几何类型。
研究其他“有趣的类型”:
SELECT owner, table_name, column_name, data_type
FROM ALL_TAB_COLUMNS
WHERE data_type IN ( 'UNDEFINED', 'HSBLKVALARY', 'HSBLKNAMLST', 'ROWID', 'ANYDATA', 'DS_VARRAY_4_CLOB' )
ORDER BY owner, table_name, data_type
输出:
所有者| TABLE_NAME | COLUMN_NAME | DATA_TYPE :----- | :---------------------------- | :-------------------- | :--------------- CTXSYS | CTX_USER_PENDING | PND_ROWID | ROWID CTXSYS | DRV $ PENDING | PND_ROWID | ROWID CTXSYS | DRV $ UNINDEXED | UNX_ROWID | ROWID CTXSYS | DRV $ UNINDEXED2 | UNX_ROWID | ROWID CTXSYS | DRV $ WAITING | WTG_ROWID | ROWID MDSYS | SDO_GR_MOSAIC_0 | RID | ROWID MDSYS | SDO_GR_MOSAIC_1 | RID | 行号 MDSYS | SDO_GR_MOSAIC_2 | RID | 行号 SYS | ALL_SCHEDULER_JOB_ARGS | ANYDATA_VALUE | ANYDATA 系统| ALL_SCHEDULER_PROGRAM_ARGS | DEFAULT_ANYDATA_VALUE | ANYDATA 系统| ALL_SQLSET_BINDS | 值| ANYDATA 系统| ALL_STREAMS_MESSAGE_CONSUMERS | NOTIFICATION_CONTEXT | ANYDATA 系统| ALL_SUMDELTA | 高行| ROWID SYS | ALL_SUMDELTA | LOWROWID | ROWID SYS | HS $ _PARALLEL_METADATA | PARTITION_COL_TYPES | HSBLKNAMLST SYS | HS $ _PARALLEL_METADATA | PARTITION_COL_NAMES | HSBLKNAMLST SYS | HS_PARALLEL_METADATA | PARTITION_COL_NAMES | HSBLKNAMLST SYS | HS_PARALLEL_METADATA | PARTITION_COL_TYPES | HSBLKNAMLST SYS | HS_PARALLEL_PARTITION_DATA | PARTITION_COL_TYPES | HSBLKNAMLST SYS | HS_PARALLEL_PARTITION_DATA | PARTITION_COL_NAMES | HSBLKNAMLST SYS | HS_PARALLEL_PARTITION_DATA | HIGH_VALUE | HSBLKVALARY SYS | HS_PARALLEL_PARTITION_DATA | LOW_VALUE | HSBLKVALARY SYS | ORA_KGLR7_IDL_SB4 | 片| 未定义的 系统| ORA_KGLR7_IDL_UB2 | 片| 未定义的 系统| USER_COMPARISON_ROW_DIF | LOCAL_ROWID | ROWID SYS | USER_PARALLEL_EXECUTE_CHUNKS | START_ROWID | 行号 SYS | USER_COMPARISON_ROW_DIF | REMOTE_ROWID | 行号 SYS | USER_PARALLEL_EXECUTE_CHUNKS | END_ROWID | ROWID SYS | USER_SCHEDULER_JOB_ARGS | ANYDATA_VALUE | ANYDATA 系统| USER_SCHEDULER_PROGRAM_ARGS | DEFAULT_ANYDATA_VALUE | ANYDATA 系统| USER_SQLSET_BINDS | 值| ANYDATA 系统| USER_SQLTUNE_BINDS | 值| ANYDATA 系统| USER_SR_STLOG_EXCEPTIONS | BAD_ROWID | ROWID SYS | USER_SUBSCR_REGISTRATIONS | ANY_CONTEXT | ANYDATA 系统| _USER_COMPARISON_ROW_DIF | RMT_ROWID | ROWID SYS | _USER_COMPARISON_ROW_DIF | LOC_ROWID | 行号 SYS | _user_stat_varray | CL1 | DS_VARRAY_4_CLOB XDB | XDB $ ROOT_INFO_V | RESOURCE_ROOT | 行号
这些都是*SYS
表或私有表,几乎可以肯定,您永远都不想直接与它们进行交互。
该UNDEFINED
类型很有趣,因为它似乎未定义:
SELECT owner, type_name
FROM ALL_TYPES
WHERE TYPE_NAME = 'UNDEFINED';
返回零行,并:
CREATE TABLE TABLE_NAME ( id UNDEFINED );
引发异常ORA-00902: invalid datatype
。
哪种方法可以更好地确定您使用的类型?只需查看您创建的模式即可:
SELECT DISTINCT owner, data_type
FROM all_tab_columns
WHERE owner IN ( 'USER1', 'USER2', 'USER3' )
然后,您知道这些数据类型就是用户创建的表中正在使用的数据类型。您应该发现,除非您做一些深奥的事情,否则您使用的大多数(如果不是全部)类型将由SQLAlchemy本地处理。
db <>在这里拨弄
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句