Skip to content

Commit 6ceb639

Browse files
committed
feat: support SchemaLike in Backend.create_table()
1 parent 912a8d1 commit 6ceb639

File tree

13 files changed

+32
-22
lines changed

13 files changed

+32
-22
lines changed

ibis/backends/bigquery/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -972,6 +972,8 @@ def create_table(
972972
"""
973973
if obj is None and schema is None:
974974
raise com.IbisError("One of the `schema` or `obj` parameter is required")
975+
if schema is not None:
976+
schema = ibis.schema(schema)
975977

976978
if isinstance(obj, ir.Table) and schema is not None:
977979
if not schema.equals(obj.schema()):

ibis/backends/clickhouse/__init__.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -666,21 +666,20 @@ def create_table(
666666

667667
if obj is None and schema is None:
668668
raise com.IbisError("The `schema` or `obj` parameter is required")
669+
if schema is not None:
670+
schema = ibis.schema(schema)
669671

670672
if obj is not None and not isinstance(obj, ir.Expr):
671673
obj = ibis.memtable(obj, schema=schema)
672674

673-
if schema is None:
674-
schema = obj.schema()
675-
676675
this = sge.Schema(
677676
this=sg.table(name, db=database),
678677
expressions=[
679678
sge.ColumnDef(
680679
this=sg.to_identifier(name, quoted=self.compiler.quoted),
681680
kind=self.compiler.type_mapper.from_ibis(typ),
682681
)
683-
for name, typ in schema.items()
682+
for name, typ in (schema or obj.schema()).items()
684683
],
685684
)
686685
properties = [

ibis/backends/duckdb/__init__.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@
4141
import torch
4242
from fsspec import AbstractFileSystem
4343

44+
from ibis.expr.schema import SchemaLike
45+
4446

4547
_UDF_INPUT_TYPE_MAPPING = {
4648
InputType.PYARROW: duckdb.functional.ARROW,
@@ -103,7 +105,7 @@ def create_table(
103105
| pl.LazyFrame
104106
| None = None,
105107
*,
106-
schema: ibis.Schema | None = None,
108+
schema: SchemaLike | None = None,
107109
database: str | None = None,
108110
temp: bool = False,
109111
overwrite: bool = False,
@@ -147,6 +149,8 @@ def create_table(
147149

148150
if obj is None and schema is None:
149151
raise ValueError("Either `obj` or `schema` must be specified")
152+
if schema is not None:
153+
schema = ibis.schema(schema)
150154

151155
properties = []
152156

ibis/backends/exasol/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,8 @@ def create_table(
342342
"""
343343
if obj is None and schema is None:
344344
raise ValueError("Either `obj` or `schema` must be specified")
345+
if schema is not None:
346+
schema = ibis.schema(schema)
345347

346348
if temp:
347349
raise com.UnsupportedOperationError(

ibis/backends/mssql/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -605,6 +605,8 @@ def create_table(
605605
"""
606606
if obj is None and schema is None:
607607
raise ValueError("Either `obj` or `schema` must be specified")
608+
if schema is not None:
609+
schema = ibis.schema(schema)
608610

609611
if temp and overwrite:
610612
raise ValueError(

ibis/backends/mysql/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,8 @@ def create_table(
395395
) -> ir.Table:
396396
if obj is None and schema is None:
397397
raise ValueError("Either `obj` or `schema` must be specified")
398+
if schema is not None:
399+
schema = ibis.schema(schema)
398400

399401
properties = []
400402

ibis/backends/oracle/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,8 @@ def create_table(
403403
"""
404404
if obj is None and schema is None:
405405
raise ValueError("Either `obj` or `schema` must be specified")
406+
if schema is not None:
407+
schema = ibis.schema(schema)
406408

407409
properties = []
408410

ibis/backends/pandas/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,8 @@ def create_table(
210210
)
211211
if obj is None and schema is None:
212212
raise com.IbisError("The schema or obj parameter is required")
213+
if schema is not None:
214+
schema = ibis.schema(schema)
213215

214216
if obj is not None:
215217
df = self._convert_object(obj)

ibis/backends/postgres/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -655,6 +655,8 @@ def create_table(
655655
"""
656656
if obj is None and schema is None:
657657
raise ValueError("Either `obj` or `schema` must be specified")
658+
if schema is not None:
659+
schema = ibis.schema(schema)
658660

659661
properties = []
660662

ibis/backends/pyspark/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -608,6 +608,7 @@ def create_table(
608608
df = self._session.sql(query)
609609
df.write.saveAsTable(name, format=format, mode=mode)
610610
elif schema is not None:
611+
schema = ibis.schema(schema)
611612
schema = PySparkSchema.from_ibis(schema)
612613
with self._active_catalog_database(catalog, db):
613614
self._session.catalog.createTable(name, schema=schema, format=format)

ibis/backends/risingwave/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,8 @@ def create_table(
177177
"""
178178
if obj is None and schema is None:
179179
raise ValueError("Either `obj` or `schema` must be specified")
180+
if schema is not None:
181+
schema = ibis.schema(schema)
180182

181183
if connector_properties is not None and (
182184
encode_format is None or data_format is None

ibis/backends/tests/test_client.py

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -85,31 +85,19 @@ def _create_temp_table_with_schema(backend, con, temp_table_name, schema, data=N
8585
"sch",
8686
[
8787
None,
88-
ibis.schema(
89-
dict(
90-
first_name="string",
91-
last_name="string",
92-
department_name="string",
93-
salary="float64",
94-
)
95-
),
88+
dict(first_name="string", salary="float64"),
89+
dict(first_name="string", salary="float64").items(),
90+
ibis.schema(dict(first_name="string", salary="float64")),
9691
],
97-
ids=["no_schema", "schema"],
92+
ids=["no_schema", "dict_schema", "tuples", "schema"],
9893
)
9994
@pytest.mark.notimpl(["druid"])
10095
@pytest.mark.notimpl(
10196
["flink"],
10297
reason="Flink backend supports creating only TEMPORARY VIEW for in-memory data.",
10398
)
10499
def test_create_table(backend, con, temp_table, func, sch):
105-
df = pd.DataFrame(
106-
{
107-
"first_name": ["A", "B", "C"],
108-
"last_name": ["D", "E", "F"],
109-
"department_name": ["AA", "BB", "CC"],
110-
"salary": [100.0, 200.0, 300.0],
111-
}
112-
)
100+
df = pd.DataFrame({"first_name": ["A", "B", "C"], "salary": [100.0, 200.0, 300.0]})
113101

114102
con.create_table(temp_table, func(df), schema=sch)
115103
result = (

ibis/backends/trino/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,8 @@ def create_table(
435435
"""
436436
if obj is None and schema is None:
437437
raise com.IbisError("One of the `schema` or `obj` parameter is required")
438+
if schema is not None:
439+
schema = ibis.schema(schema)
438440

439441
if temp:
440442
raise NotImplementedError(

0 commit comments

Comments
 (0)