sqlor/aidocs/oracleor.md
2025-10-05 11:24:24 +08:00

363 lines
8.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# `Oracleor` 类技术文档
```markdown
# Oracle 数据库操作类:`Oracleor`
`Oracleor` 是一个用于操作 Oracle 数据库的 Python 类,继承自 `SQLor` 基类。该类封装了与 Oracle 数据库交互所需的核心功能,包括数据类型映射、分页查询、元数据获取(表、字段、主键、外键、索引等)、占位符处理以及 SQL 模板管理。
---
## 继承关系
- **父类**: `SQLor`
- **所在模块**: `.sor.SQLor`
- **用途**: 提供通用 SQL 操作接口
## 依赖项
```python
from .sor import SQLor
from .ddl_template_oracle import oracle_ddl_tmpl
```
- `oracle_ddl_tmpl`: Oracle 特定的 DDL数据定义语言模板用于生成建表语句等。
---
## 类定义
```python
class Oracleor(SQLor):
ddl_template = oracle_ddl_tmpl
...
```
---
## 核心属性
### 1. `ddl_template`
```python
ddl_template = oracle_ddl_tmpl
```
- **说明**: 使用 Oracle 专用的 DDL 模板来生成建表语句。
- **用途**: 支持通过模型自动生成数据库表结构。
---
### 2. `db2modelTypeMapping`
将 Oracle 数据库字段类型映射为应用层模型类型(如 Python 或 ORM 模型类型)。
| Oracle 类型 | 映射模型类型 |
|------------|-------------|
| `char` | `char` |
| `nchar` | `str` |
| `varchar`, `varchar2`, `nvarchar2` | `str` |
| `number`, `integer` | `long` |
| `binary_float`, `binary_double`, `float` | `float` |
| `timestamp`, `timestamp with time zone`, `timestamp with local time zone`, `interval day to second` | `timestamp` |
| `interval year to moth` | `date` |
| `clob`, `nclob` | `text` |
| `blob`, `bfile` | `file` |
| `date` | `date` |
> ⚠️ 注意:`interval year to moth` 存在拼写错误,应为 `interval year to month`。
---
### 3. `model2dbTypemapping`
将模型类型反向映射为 Oracle 数据库字段类型。
| 模型类型 | 映射 Oracle 类型 |
|---------|------------------|
| `date`, `time`, `timestamp` | `date` |
| `str` | `varchar2` |
| `char` | `char` |
| `short`, `long`, `float` | `number` |
| `text` | `nclob` |
| `file` | `blob` |
---
## 类方法
### `@classmethod isMe(cls, name)`
判断当前驱动是否为 Oracle 驱动。
#### 参数:
- `name` (str): 数据库连接使用的驱动名称。
#### 返回值:
- `True` 如果 `name == 'cx_Oracle'`,否则 `False`
#### 示例:
```python
if Oracleor.isMe('cx_Oracle'):
print("This is Oracle database.")
```
---
## 实例方法
### `grammar(self)`
返回当前数据库支持的 SQL 语法结构(目前仅支持 `select`)。
#### 返回值:
```python
{
'select': select_stmt
}
```
> ⚠️ 注意:`select_stmt` 未在代码中定义,可能是外部导入或遗漏。
---
### `placeHolder(self, varname, pos=None)`
生成适用于 Oracle 的参数占位符(使用命名绑定变量)。
#### 参数:
- `varname` (str): 变量名。
- `pos` (int, optional): 位置参数(未使用)。
#### 规则:
-`varname == '__mainsql__'`,返回空字符串。
- 否则返回 `:%s` 格式,例如 `:username`
#### 示例:
```python
self.placeHolder('username') # 输出: ':username'
```
---
### `dataConvert(self, dataList)`
将数据库原始结果列表转换为字典格式。
#### 参数:
- `dataList`: 可以是字典或包含字段信息的列表(如 `[{'name': 'id', 'value': 1}, ...]`)。
#### 返回值:
- 转换后的字典,键为字段名,值为对应值。
#### 示例:
```python
input_data = [{'name': 'id', 'value': 1}, {'name': 'name', 'value': 'Alice'}]
result = obj.dataConvert(input_data)
# result => {'id': 1, 'name': 'Alice'}
```
---
### `pagingSQLmodel(self)`
返回 Oracle 分页查询的 SQL 模板(基于 `ROWNUM` 实现)。
#### 返回模板:
```sql
select *
from (
select page_s.*, rownum row_id
from (%s) page_s
order by $[sort]$
)
where row_id >= $[from_line]$ and row_id < $[end_line]$
```
#### 占位符说明:
- `%s`: 子查询(原始 SQL
- `$[sort]$`: 排序字段
- `$[from_line]$`: 起始行号(从 1 开始)
- `$[end_line]$`: 结束行号(不包含)
> ✅ 适用于 Oracle 9i 及以上版本。
---
### `tablesSQL(self)`
生成查询当前用户所有表及其注释的 SQL。
#### 返回 SQL
```sql
select
lower(table_name) as name,
lower(decode(comments,null,table_name,comments)) as title
from USER_TAB_COMMENTS where table_type = 'TABLE'
```
#### 字段说明:
- `name`: 表名(小写)
- `title`: 表标题/注释,若无注释则用表名代替
> 查询来源:`USER_TAB_COMMENTS`
---
### `fieldsSQL(self, tablename=None)`
查询指定表的所有字段信息。
#### 参数:
- `tablename` (str, optional): 表名(不区分大小写)
#### 返回 SQL
```sql
select lower(utc.COLUMN_NAME) name
,utc.DATA_TYPE type
,utc.DATA_LENGTH length
,utc.data_scale dec
,case when utc.nullable = 'Y' then 'yes' else 'no' end nullable
,lower(nvl(ucc.comments,utc.COLUMN_NAME)) title
,lower(utc.table_name) as table_name
from user_tab_cols utc left join USER_COL_COMMENTS ucc
on utc.table_name = ucc.table_name and utc.COLUMN_NAME = ucc.COLUMN_NAME
```
如果提供了 `tablename`,会添加过滤条件:
```sql
where lower(utc.table_name) = 'xxx'
```
#### 字段说明:
| 字段 | 含义 |
|------|------|
| `name` | 字段名(小写) |
| `type` | 数据类型 |
| `length` | 字段长度 |
| `dec` | 小数位数scale |
| `nullable` | 是否可为空('yes'/'no' |
| `title` | 字段注释,无则用字段名替代 |
| `table_name`| 所属表名(小写) |
> 数据源:`user_tab_cols`, `USER_COL_COMMENTS`
---
### `fkSQL(self, tablename=None)`
查询外键约束信息。
#### 参数:
- `tablename` (str, optional): 限定查询某一张表的外键
#### 返回 SQL
```sql
select
distinct(ucc.column_name) as field,
rela.table_name as fk_table,
rela.column_name as fk_field
from
user_constraints uc,
user_cons_columns ucc,
(
select t2.table_name, t2.column_name, t1.r_constraint_name
from user_constraints t1, user_cons_columns t2
where t1.r_constraint_name = t2.constraint_name
) rela
where
uc.constraint_name = ucc.constraint_name
and uc.r_constraint_name = rela.r_constraint_name
```
若有表名,则追加:
```sql
and lower(uc.table_name) = 'xxx'
```
#### 返回字段:
- `field`: 当前表的外键字段
- `fk_table`: 引用的目标表
- `fk_field`: 目标表中的被引用字段
> 用于构建表间关联关系。
---
### `pkSQL(self, tablename=None)`
查询主键字段信息。
#### 参数:
- `tablename` (str, optional): 限定查询某张表的主键
#### 返回 SQL
```sql
select
lower(col.table_name) table_name,
lower(col.column_name) as field_name
from
user_constraints con,
user_cons_columns col
where
con.constraint_name = col.constraint_name
and con.constraint_type = 'P'
```
若有表名,则追加:
```sql
and lower(col.table_name) = 'xxx'
```
#### 返回字段:
- `table_name`: 表名(小写)
- `field_name`: 主键字段名(小写)
> `constraint_type='P'` 表示主键约束。
---
### `indexesSQL(self, tablename=None)`
查询索引信息。
#### 参数:
- `tablename` (str, optional): 限定查询某张表的索引
#### 返回 SQL
```sql
select
lower(a.index_name) index_name,
lower(a.UNIQUENESS) is_unique,
lower(b.column_name) column_name
from user_indexes a, user_ind_columns b
where a.index_name = b.index_name
```
若有表名,则追加:
```sql
and lower(a.table_name) = lower('xxx')
```
#### 返回字段:
- `index_name`: 索引名称(小写)
- `is_unique`: 是否唯一(`unique` / `non-unique`
- `column_name`: 索引包含的字段名(小写)
> 支持多字段索引(每行一个字段)。
---
## 总结
`Oracleor` 类为 Oracle 数据库提供了完整的元数据读取和 SQL 构造能力,适用于:
- 自动生成模型ORM 映射)
- 可视化数据库结构工具
- 动态 SQL 执行与分页
- 数据迁移与同步系统
其设计遵循抽象与具体分离原则,便于扩展至其他数据库。
---
> 📌 **备注**:部分变量(如 `select_stmt`)可能依赖外部定义,请确保上下文完整。
```