将Oracle数据类型转换为SQLAlchemy类型

梅勒·库波

我有一个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。因此,我真的希望避免手动查找每个文档。

MT0
  • XMLTYPE数据类型getStringValgetClobVal方法(取决于内容的长度),可以使用提取这将只是一个字符串值,可以使用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.Stringor 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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Oracle 将列数据类型转换为多列

来自分类Dev

在Oracle中将NUMBER数据类型转换为BIT

来自分类Dev

将String ISO-8601日期转换为oracle的timestamp数据类型

来自分类Dev

将数据类型Clob转换为Varchar2 Oracle

来自分类Dev

如何将Mobus数据数组的数据类型转换为REAL数据类型

来自分类Dev

将numpy数据类型转换为本地python数据类型的更简单方法

来自分类Dev

将数据类型CHAR转换为plsql中的数据类型boolean

来自分类Dev

将字符串引用数据类型转换为真正的引用数据类型

来自分类Dev

将 varchar 数据类型转换为 datetime 数据类型导致值超出范围

来自分类Dev

将数据类型从varchar转换为数值时出错

来自分类Dev

将HTML5数据类型转换为数字

来自分类Dev

将 nvarchar 值转换为数据类型整数

来自分类Dev

将表列数据类型从Blob转换为Raw

来自分类Dev

将表列数据类型从图像转换为varbinary

来自分类Dev

将MySQL POINT数据类型转换为PostgreSQL

来自分类Dev

将通用参数转换为原始数据类型

来自分类Dev

通过泛型将数据类型转换为xml?

来自分类Dev

如何将Date数据类型转换为整数?

来自分类Dev

如何将NSInteger转换为NSString数据类型?

来自分类Dev

将因子转换为逻辑数据类型

来自分类Dev

将图像数据类型转换为Varchar

来自分类Dev

将数据类型 varchar 转换为 float 时出错。?

来自分类Dev

将数据类型“对象”转换为“浮动”

来自分类Dev

PyQ-将数据类型转换为空表

来自分类Dev

将数据类型NVarchar转换为int时出错

来自分类Dev

将文本转换为日期数据类型

来自分类Dev

将varchar转换为数据类型int失败

来自分类Dev

将多列中的数据类型转换为日期

来自分类Dev

将数据类型 nvarchar 转换为数字时出错

Related 相关文章

热门标签

归档