forked from datafold/data-diff
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathquery_utils.py
56 lines (42 loc) · 1.46 KB
/
query_utils.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
"Module for query utilities that didn't make it into the query-builder (yet)"
from contextlib import suppress
from data_diff.abcs.database_types import DbPath
from data_diff.databases.base import QueryError
from data_diff.databases.oracle import Oracle
from data_diff.queries.api import table, commit, Expr
def _drop_table_oracle(name: DbPath):
t = table(name)
# Experience shows double drop is necessary
with suppress(QueryError):
yield t.drop()
yield t.drop()
yield commit
def _drop_table(name: DbPath):
t = table(name)
yield t.drop(if_exists=True)
yield commit
def drop_table(db, tbl) -> None:
if isinstance(db, Oracle):
db.query(_drop_table_oracle(tbl))
else:
db.query(_drop_table(tbl))
def _append_to_table_oracle(path: DbPath, expr: Expr):
"""See append_to_table"""
assert expr.schema, expr
t = table(path, schema=expr.schema)
with suppress(QueryError):
yield t.create() # uses expr.schema
yield commit
yield t.insert_expr(expr)
yield commit
def _append_to_table(path: DbPath, expr: Expr):
"""Append to table"""
assert expr.schema, expr
t = table(path, schema=expr.schema)
yield t.create(if_not_exists=True) # uses expr.schema
yield commit
yield t.insert_expr(expr)
yield commit
def append_to_table(db, path, expr) -> None:
f = _append_to_table_oracle if isinstance(db, Oracle) else _append_to_table
db.query(f(path, expr))