Skip to content

Commit 53ed1f0

Browse files
authored
Merge pull request #857 from kongscn/specify-schema-oracle
feat(oracle): support schema query parameter in connection URL
2 parents de9e1fd + 0fd0524 commit 53ed1f0

File tree

3 files changed

+31
-7
lines changed

3 files changed

+31
-7
lines changed

connectorx/src/partition.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::sources::mssql::{mssql_config, FloatN, IntN, MsSQLTypeSystem};
77
#[cfg(feature = "src_mysql")]
88
use crate::sources::mysql::{MySQLSourceError, MySQLTypeSystem};
99
#[cfg(feature = "src_oracle")]
10-
use crate::sources::oracle::{connect_oracle, OracleDialect};
10+
use crate::sources::oracle::{connect_oracle, OracleDialect, OracleSource};
1111
#[cfg(feature = "src_postgres")]
1212
use crate::sources::postgres::{rewrite_tls_args, PostgresTypeSystem};
1313
#[cfg(feature = "src_trino")]
@@ -451,8 +451,8 @@ fn mssql_get_partition_range(conn: &Url, query: &str, col: &str) -> (i64, i64) {
451451
#[cfg(feature = "src_oracle")]
452452
#[throws(ConnectorXOutError)]
453453
fn oracle_get_partition_range(conn: &Url, query: &str, col: &str) -> (i64, i64) {
454-
let connector = connect_oracle(conn)?;
455-
let conn = connector.connect()?;
454+
let source = OracleSource::new(conn.as_str(), 1)?;
455+
let conn = source.get_conn()?;
456456
let range_query = get_partition_range_query(query, col, &OracleDialect {})?;
457457
let row = conn.query_row(range_query.as_str(), &[])?;
458458
let min_v: i64 = row.get(0).unwrap_or(0);

connectorx/src/sources/oracle/mod.rs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ pub struct OracleSource {
5050
queries: Vec<CXQuery<String>>,
5151
names: Vec<String>,
5252
schema: Vec<OracleTypeSystem>,
53+
current_schema: Option<String>,
5354
}
5455

5556
#[throws(OracleSourceError)]
@@ -86,14 +87,25 @@ impl OracleSource {
8687
.max_size(nconn as u32)
8788
.build(manager)?;
8889

90+
let params: HashMap<String, String> = conn.query_pairs().into_owned().collect();
91+
let current_schema = params.get("schema").cloned();
92+
8993
Self {
9094
pool,
9195
origin_query: None,
9296
queries: vec![],
9397
names: vec![],
9498
schema: vec![],
99+
current_schema,
95100
}
96101
}
102+
pub fn get_conn(&self) -> Result<OracleConn, OracleSourceError> {
103+
let conn = self.pool.get()?;
104+
if let Some(schema) = &self.current_schema {
105+
conn.set_current_schema(schema)?;
106+
}
107+
Ok(conn)
108+
}
97109
}
98110

99111
impl Source for OracleSource
@@ -125,7 +137,7 @@ where
125137
fn fetch_metadata(&mut self) {
126138
assert!(!self.queries.is_empty());
127139

128-
let conn = self.pool.get()?;
140+
let conn = self.get_conn()?;
129141
for (i, query) in self.queries.iter().enumerate() {
130142
// assuming all the partition queries yield same schema
131143
// without rownum = 1, derived type might be wrong
@@ -171,7 +183,7 @@ where
171183
match &self.origin_query {
172184
Some(q) => {
173185
let cxq = CXQuery::Naked(q.clone());
174-
let conn = self.pool.get()?;
186+
let conn = self.get_conn()?;
175187

176188
let nrows = conn
177189
.query_row_as::<usize>(count_query(&cxq, &OracleDialect {})?.as_str(), &[])?;
@@ -192,8 +204,8 @@ where
192204
#[throws(OracleSourceError)]
193205
fn partition(self) -> Vec<Self::Partition> {
194206
let mut ret = vec![];
195-
for query in self.queries {
196-
let conn = self.pool.get()?;
207+
for query in &self.queries {
208+
let conn = self.get_conn()?;
197209
ret.push(OracleSourcePartition::new(conn, &query, &self.schema));
198210
}
199211
ret

docs/databases/oracle.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,18 @@ query = 'SELECT * FROM table' # query string
2121
cx.read_sql(conn, query) # read data from Oracle
2222
```
2323

24+
### Specifying Default Schema
25+
26+
With version>=0.4.5 you can specify a default schema by adding the `schema` query parameter to the connection URL. This automatically sets the current schema for all connections, eliminating the need to prefix table names with the schema in your queries.
27+
28+
```py
29+
import connectorx as cx
30+
# Specify schema in the connection URL
31+
conn = 'oracle://username:password@server:port/database?schema=MY_SCHEMA'
32+
query = 'SELECT * FROM table' # No need to use MY_SCHEMA.table
33+
cx.read_sql(conn, query)
34+
```
35+
2436
### Oracle-Pandas Type Mapping
2537
| Oracle Type | Pandas Type | Comment |
2638
|:-------------------------:|:---------------------------:|:----------------------------------:|

0 commit comments

Comments
 (0)