From 6f8baf22bda51a666e3151cf49be2a9cdc5f05d8 Mon Sep 17 00:00:00 2001 From: Gregory Livschitz Date: Fri, 3 Apr 2020 14:51:16 -0400 Subject: [PATCH] Added schema kwarg and test Added what's new cleaned up code so that it follows flake8 Cleaned up after commit Removed print statement --- doc/source/whatsnew/v1.1.0.rst | 1 + pandas/io/sql.py | 32 +++++++++++++++++++++++++------- pandas/tests/io/test_sql.py | 6 ++++++ 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/doc/source/whatsnew/v1.1.0.rst b/doc/source/whatsnew/v1.1.0.rst index 1c5c8ed23273d9..9c3df0fa6fe623 100644 --- a/doc/source/whatsnew/v1.1.0.rst +++ b/doc/source/whatsnew/v1.1.0.rst @@ -88,6 +88,7 @@ Other enhancements - :class:`Series.str` now has a `fullmatch` method that matches a regular expression against the entire string in each row of the series, similar to `re.fullmatch` (:issue:`32806`). - :meth:`DataFrame.sample` will now also allow array-like and BitGenerator objects to be passed to ``random_state`` as seeds (:issue:`32503`) - :meth:`MultiIndex.union` will now raise `RuntimeWarning` if the object inside are unsortable, pass `sort=False` to suppress this warning (:issue:`33015`) +- :meth:`get_schema` will now allow a schema kwarg that will add a schema into the create table statement - .. --------------------------------------------------------------------------- diff --git a/pandas/io/sql.py b/pandas/io/sql.py index 3891afa5e332d3..9e6c9699b522a9 100644 --- a/pandas/io/sql.py +++ b/pandas/io/sql.py @@ -1372,9 +1372,15 @@ def drop_table(self, table_name, schema=None): self.get_table(table_name, schema).drop() self.meta.clear() - def _create_sql_schema(self, frame, table_name, keys=None, dtype=None): + def _create_sql_schema(self, frame, table_name, keys=None, dtype=None, schema=None): table = SQLTable( - table_name, self, frame=frame, index=False, keys=keys, dtype=dtype + table_name, + self, + frame=frame, + index=False, + keys=keys, + dtype=dtype, + schema=schema, ) return str(table.sql_schema()) @@ -1505,9 +1511,13 @@ def _create_table_setup(self): create_tbl_stmts.append( f"CONSTRAINT {self.name}_pk PRIMARY KEY ({cnames_br})" ) - + if self.schema: + schema_to_add = self.schema + "." + else: + schema_to_add = "" create_stmts = [ "CREATE TABLE " + + schema_to_add + escape(self.name) + " (\n" + ",\n ".join(create_tbl_stmts) @@ -1762,14 +1772,20 @@ def drop_table(self, name, schema=None): drop_sql = f"DROP TABLE {_get_valid_sqlite_name(name)}" self.execute(drop_sql) - def _create_sql_schema(self, frame, table_name, keys=None, dtype=None): + def _create_sql_schema(self, frame, table_name, keys=None, dtype=None, schema=None): table = SQLiteTable( - table_name, self, frame=frame, index=False, keys=keys, dtype=dtype + table_name, + self, + frame=frame, + index=False, + keys=keys, + dtype=dtype, + schema=schema, ) return str(table.sql_schema()) -def get_schema(frame, name, keys=None, con=None, dtype=None): +def get_schema(frame, name, keys=None, con=None, dtype=None, schema=None): """ Get the SQL db table schema for the given frame. @@ -1790,4 +1806,6 @@ def get_schema(frame, name, keys=None, con=None, dtype=None): """ pandas_sql = pandasSQL_builder(con=con) - return pandas_sql._create_sql_schema(frame, name, keys=keys, dtype=dtype) + return pandas_sql._create_sql_schema( + frame, name, keys=keys, dtype=dtype, schema=schema + ) diff --git a/pandas/tests/io/test_sql.py b/pandas/tests/io/test_sql.py index 2f2ae8cd9d32b4..babe80432c07e8 100644 --- a/pandas/tests/io/test_sql.py +++ b/pandas/tests/io/test_sql.py @@ -855,6 +855,12 @@ def test_get_schema(self): create_sql = sql.get_schema(self.test_frame1, "test", con=self.conn) assert "CREATE" in create_sql + def test_get_schema_with_schema(self): + create_sql = sql.get_schema( + self.test_frame1, "test", con=self.conn, schema="pypi" + ) + assert "pypi" in create_sql + def test_get_schema_dtypes(self): float_frame = DataFrame({"a": [1.1, 1.2], "b": [2.1, 2.2]}) dtype = sqlalchemy.Integer if self.mode == "sqlalchemy" else "INTEGER"