From 3e629593192ee49dc2c816fe21eaf84412400eb5 Mon Sep 17 00:00:00 2001 From: Gregory Livschitz Date: Fri, 3 Apr 2020 14:51:16 -0400 Subject: [PATCH 1/4] Added schema kwarg and test --- 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 836c4123cf158..fe187536b3a20 100644 --- a/doc/source/whatsnew/v1.1.0.rst +++ b/doc/source/whatsnew/v1.1.0.rst @@ -99,6 +99,7 @@ Other enhancements ``df.to_csv(path, compression={'method': 'gzip', 'compresslevel': 1}`` (:issue:`33196`) - :meth:`~pandas.core.groupby.GroupBy.transform` has gained ``engine`` and ``engine_kwargs`` arguments that supports executing functions with ``Numba`` (:issue:`32854`) +- :meth:`get_schema` will now allow a schema kwarg that will add a schema into the create table statement (:issue:`28486`) - .. --------------------------------------------------------------------------- diff --git a/pandas/io/sql.py b/pandas/io/sql.py index c657a925a5eab..c162fc449a9d6 100644 --- a/pandas/io/sql.py +++ b/pandas/io/sql.py @@ -1360,9 +1360,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()) @@ -1493,9 +1499,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) @@ -1750,14 +1760,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. @@ -1778,4 +1794,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 2f2ae8cd9d32b..e0123cbd3c57c 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 "CREATE TABLE 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" From 9074f5cf34951aede5a1fdffff2603af559c68e2 Mon Sep 17 00:00:00 2001 From: Gregory Livschitz Date: Mon, 24 Aug 2020 22:45:38 -0400 Subject: [PATCH 2/4] Added type hinting and marked GH issue in test case --- pandas/io/sql.py | 17 ++++++++++++----- pandas/tests/io/test_sql.py | 1 + 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/pandas/io/sql.py b/pandas/io/sql.py index c585cccf917be..fb72ad0110566 100644 --- a/pandas/io/sql.py +++ b/pandas/io/sql.py @@ -7,7 +7,7 @@ from datetime import date, datetime, time from functools import partial import re -from typing import Iterator, Optional, Union, overload +from typing import List, Iterator, Optional, Union, overload import warnings import numpy as np @@ -1455,7 +1455,14 @@ 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, schema=None): + def _create_sql_schema( + self, + frame: DataFrame, + table_name: str, + keys: Optional[List[str]] = None, + dtype : Optional[dict]=None, + schema: Optional[str] = None + ): table = SQLTable( table_name, self, @@ -1595,12 +1602,12 @@ def _create_table_setup(self): f"CONSTRAINT {self.name}_pk PRIMARY KEY ({cnames_br})" ) if self.schema: - schema_to_add = self.schema + "." + schema_name = self.schema + "." else: - schema_to_add = "" + schema_name = "" create_stmts = [ "CREATE TABLE " - + schema_to_add + + schema_name + escape(self.name) + " (\n" + ",\n ".join(create_tbl_stmts) diff --git a/pandas/tests/io/test_sql.py b/pandas/tests/io/test_sql.py index 3c33b85638285..a8b2b63ee65b5 100644 --- a/pandas/tests/io/test_sql.py +++ b/pandas/tests/io/test_sql.py @@ -866,6 +866,7 @@ def test_get_schema(self): create_sql = sql.get_schema(self.test_frame1, "test", con=self.conn) assert "CREATE" in create_sql + # GH28486 def test_get_schema_with_schema(self): create_sql = sql.get_schema( self.test_frame1, "test", con=self.conn, schema="pypi" From 05d5c228573c0cf48760686404838089909baae7 Mon Sep 17 00:00:00 2001 From: Gregory Livschitz Date: Mon, 24 Aug 2020 23:03:45 -0400 Subject: [PATCH 3/4] fixed pep8 issues --- pandas/io/sql.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/io/sql.py b/pandas/io/sql.py index fb72ad0110566..31be566ed21b2 100644 --- a/pandas/io/sql.py +++ b/pandas/io/sql.py @@ -1460,9 +1460,9 @@ def _create_sql_schema( frame: DataFrame, table_name: str, keys: Optional[List[str]] = None, - dtype : Optional[dict]=None, + dtype : Optional[dict] = None, schema: Optional[str] = None - ): + ): table = SQLTable( table_name, self, From d549c7b672334175f298f7435ceb6d3eab4a2738 Mon Sep 17 00:00:00 2001 From: Gregory Livschitz Date: Thu, 27 Aug 2020 23:31:28 -0400 Subject: [PATCH 4/4] Fixed sorting on import --- pandas/io/sql.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/io/sql.py b/pandas/io/sql.py index 31be566ed21b2..4816112b1c087 100644 --- a/pandas/io/sql.py +++ b/pandas/io/sql.py @@ -7,7 +7,7 @@ from datetime import date, datetime, time from functools import partial import re -from typing import List, Iterator, Optional, Union, overload +from typing import Iterator, List, Optional, Union, overload import warnings import numpy as np