From 20f0c213d6151596710708124aa4a5d08fc70fdb Mon Sep 17 00:00:00 2001 From: RahulHP Date: Sat, 21 May 2016 21:53:14 +0530 Subject: [PATCH] ENH: Allow to_sql to recognize single sql type #11886 PEP #3 --- doc/source/whatsnew/v0.18.2.txt | 2 ++ pandas/io/sql.py | 13 +++++++------ pandas/io/tests/test_sql.py | 32 ++++++++++++++++---------------- 3 files changed, 25 insertions(+), 22 deletions(-) diff --git a/doc/source/whatsnew/v0.18.2.txt b/doc/source/whatsnew/v0.18.2.txt index 6dc4db97d287a..f71ee1e1369bb 100644 --- a/doc/source/whatsnew/v0.18.2.txt +++ b/doc/source/whatsnew/v0.18.2.txt @@ -74,6 +74,8 @@ Other enhancements pd.Timestamp(year=2012, month=1, day=1, hour=8, minute=30) +- ``DataFrame.to_sql `` now allows a single value as the SQL type for all columns (:issue:`11886`). + - The ``pd.read_csv()`` with ``engine='python'`` has gained support for the ``decimal`` option (:issue:`12933`) - ``Index.astype()`` now accepts an optional boolean argument ``copy``, which allows optional copying if the requirements on dtype are satisfied (:issue:`13209`) diff --git a/pandas/io/sql.py b/pandas/io/sql.py index eef1b12eb47f8..1e9771b140ff2 100644 --- a/pandas/io/sql.py +++ b/pandas/io/sql.py @@ -1233,14 +1233,15 @@ def to_sql(self, frame, name, if_exists='fail', index=True, chunksize : int, default None If not None, then rows will be written in batches of this size at a time. If None, all rows will be written at once. - dtype : single SQL type or dict of column name to SQL type, default None + dtype : single SQL type or dict of column name to SQL type, default + None Optional specifying the datatype for columns. The SQL type should - be a SQLAlchemy type. If all columns are of the same type, one + be a SQLAlchemy type. If all columns are of the same type, one single value can be used. """ if dtype and not is_dictlike(dtype): - dtype = {col_name : dtype for col_name in frame} + dtype = {col_name: dtype for col_name in frame} if dtype is not None: from sqlalchemy.types import to_instance, TypeEngine @@ -1650,15 +1651,15 @@ def to_sql(self, frame, name, if_exists='fail', index=True, chunksize : int, default None If not None, then rows will be written in batches of this size at a time. If None, all rows will be written at once. - dtype : single SQL type or dict of column name to SQL type, default None + dtype : single SQL type or dict of column name to SQL type, default + None Optional specifying the datatype for columns. The SQL type should be a string. If all columns are of the same type, one single value can be used. """ if dtype and not is_dictlike(dtype): - dtype = {col_name : dtype for col_name in frame} - + dtype = {col_name: dtype for col_name in frame} if dtype is not None: for col, my_type in dtype.items(): if not isinstance(my_type, str): diff --git a/pandas/io/tests/test_sql.py b/pandas/io/tests/test_sql.py index 9aa3fa7330c4b..621c34ff75ce8 100644 --- a/pandas/io/tests/test_sql.py +++ b/pandas/io/tests/test_sql.py @@ -1552,20 +1552,18 @@ def test_dtype(self): self.assertTrue(isinstance(sqltype, sqlalchemy.String)) self.assertEqual(sqltype.length, 10) - def test_to_sql_save_indexgle_dtype(self): - self.drop('single_dtype_test') - cols = ['A','B'] - data = [('a','b'), - ('c','d')] - df = DataFrame(data,columns=cols) - df.to_sql('single_dtype_test',self.conn,dtype=sqlalchemy.TEXT) + def test_to_sql_single_dtype(self): + cols = ['A', 'B'] + data = [('a', 'b'), + ('c', 'd')] + df = DataFrame(data, columns=cols) + df.to_sql('single_dtype_test', self.conn, dtype=sqlalchemy.TEXT) meta = sqlalchemy.schema.MetaData(bind=self.conn) meta.reflect() sqltypea = meta.tables['single_dtype_test'].columns['A'].type sqltypeb = meta.tables['single_dtype_test'].columns['B'].type self.assertTrue(isinstance(sqltypea, sqlalchemy.TEXT)) self.assertTrue(isinstance(sqltypeb, sqlalchemy.TEXT)) - self.drop_table('single_dtype_test') def test_notnull_dtype(self): cols = {'Bool': Series([True, None]), @@ -2044,15 +2042,17 @@ def test_to_sql_single_dtype(self): if self.flavor == 'mysql': raise nose.SkipTest('Not applicable to MySQL legacy') self.drop_table('single_dtype_test') - cols = ['A','B'] - data = [('a','b'), - ('c','d')] - df = DataFrame(data,columns=cols) - df.to_sql('single_dtype_test',self.conn,dtype='STRING') - self.assertEqual(self._get_sqlite_column_type('single_dtype_test','A'),'STRING') - self.assertEqual(self._get_sqlite_column_type('single_dtype_test','B'),'STRING') + cols = ['A', 'B'] + data = [('a', 'b'), + ('c', 'd')] + df = DataFrame(data, columns=cols) + df.to_sql('single_dtype_test', self.conn, dtype='STRING') + self.assertEqual( + self._get_sqlite_column_type('single_dtype_test', 'A'), 'STRING') + self.assertEqual( + self._get_sqlite_column_type('single_dtype_test', 'B'), 'STRING') self.drop_table('single_dtype_test') - + def test_notnull_dtype(self): if self.flavor == 'mysql': raise nose.SkipTest('Not applicable to MySQL legacy')