From 73d20c04ef88040e5716d22f29aa19734c74d1f5 Mon Sep 17 00:00:00 2001 From: Peter Pudaite Date: Thu, 16 Feb 2017 14:15:19 +0000 Subject: [PATCH 1/4] Converted index name to string to fix issue #15404 - BUG: to_sql errors with numeric index name - needs conversion to string --- 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 55e145b493dd9..fd3219853a695 100644 --- a/pandas/io/sql.py +++ b/pandas/io/sql.py @@ -750,7 +750,7 @@ def _get_column_names_and_types(self, dtype_mapper): for i, idx_label in enumerate(self.index): idx_type = dtype_mapper( self.frame.index.get_level_values(i)) - column_names_and_types.append((idx_label, idx_type, True)) + column_names_and_types.append(((text_type(idx_label)), idx_type, True)) column_names_and_types += [ (text_type(self.frame.columns[i]), From ee53748ae162e94dc497ea3c42b5115033d677ae Mon Sep 17 00:00:00 2001 From: Peter Pudaite Date: Thu, 16 Feb 2017 20:29:37 +0000 Subject: [PATCH 2/4] Additional int to string conversion added. Associated test cases added. --- pandas/io/sql.py | 2 +- pandas/tests/io/test_sql.py | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/pandas/io/sql.py b/pandas/io/sql.py index fd3219853a695..a258258eabbd9 100644 --- a/pandas/io/sql.py +++ b/pandas/io/sql.py @@ -1220,7 +1220,7 @@ def _create_sql_schema(self, frame, table_name, keys=None, dtype=None): def _get_unicode_name(name): try: - uname = name.encode("utf-8", "strict").decode("utf-8") + uname = text_type(name).encode("utf-8", "strict").decode("utf-8") except UnicodeError: raise ValueError("Cannot convert identifier to UTF-8: '%s'" % name) return uname diff --git a/pandas/tests/io/test_sql.py b/pandas/tests/io/test_sql.py index 78560611da7aa..3033154c1aa3f 100644 --- a/pandas/tests/io/test_sql.py +++ b/pandas/tests/io/test_sql.py @@ -709,6 +709,21 @@ def test_to_sql_index_label(self): self.assertEqual(frame.columns[0], 'other_label', "Specified index_label not written to database") + # index name is integer + temp_frame.index.name = 0 + sql.to_sql(temp_frame, 'test_index_label', self.conn, + if_exists='replace') + frame = sql.read_sql_query('SELECT * FROM test_index_label', self.conn) + self.assertEqual(frame.columns[0], '0', + "Integer index label not written to database") + + temp_frame.index.name = None + sql.to_sql(temp_frame, 'test_index_label', self.conn, + if_exists='replace', index_label= 0) + frame = sql.read_sql_query('SELECT * FROM test_index_label', self.conn) + self.assertEqual(frame.columns[0], '0', + "Integer index label not written to database") + def test_to_sql_index_label_multiindex(self): temp_frame = DataFrame({'col1': range(4)}, index=MultiIndex.from_product( From 2f4fbba9962d4a68610296eab9636276acb0ca97 Mon Sep 17 00:00:00 2001 From: Peter Pudaite Date: Thu, 16 Feb 2017 20:39:01 +0000 Subject: [PATCH 3/4] PEP 8 compliance edits --- pandas/io/sql.py | 3 ++- pandas/tests/io/test_sql.py | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/pandas/io/sql.py b/pandas/io/sql.py index a258258eabbd9..c5cb09b124099 100644 --- a/pandas/io/sql.py +++ b/pandas/io/sql.py @@ -750,7 +750,8 @@ def _get_column_names_and_types(self, dtype_mapper): for i, idx_label in enumerate(self.index): idx_type = dtype_mapper( self.frame.index.get_level_values(i)) - column_names_and_types.append(((text_type(idx_label)), idx_type, True)) + column_names_and_types.append(((text_type(idx_label)), + idx_type, True)) column_names_and_types += [ (text_type(self.frame.columns[i]), diff --git a/pandas/tests/io/test_sql.py b/pandas/tests/io/test_sql.py index 3033154c1aa3f..890f52e8c65e9 100644 --- a/pandas/tests/io/test_sql.py +++ b/pandas/tests/io/test_sql.py @@ -715,11 +715,11 @@ def test_to_sql_index_label(self): if_exists='replace') frame = sql.read_sql_query('SELECT * FROM test_index_label', self.conn) self.assertEqual(frame.columns[0], '0', - "Integer index label not written to database") + "Integer index label not written to database") temp_frame.index.name = None sql.to_sql(temp_frame, 'test_index_label', self.conn, - if_exists='replace', index_label= 0) + if_exists='replace', index_label=0) frame = sql.read_sql_query('SELECT * FROM test_index_label', self.conn) self.assertEqual(frame.columns[0], '0', "Integer index label not written to database") From e9a4f3a12643234d7d95ff61aa80677d2f918b82 Mon Sep 17 00:00:00 2001 From: Peter Pudaite Date: Thu, 16 Feb 2017 23:52:23 +0000 Subject: [PATCH 4/4] Removed extraneous brackets --- 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 c5cb09b124099..bace43e785dff 100644 --- a/pandas/io/sql.py +++ b/pandas/io/sql.py @@ -750,7 +750,7 @@ def _get_column_names_and_types(self, dtype_mapper): for i, idx_label in enumerate(self.index): idx_type = dtype_mapper( self.frame.index.get_level_values(i)) - column_names_and_types.append(((text_type(idx_label)), + column_names_and_types.append((text_type(idx_label), idx_type, True)) column_names_and_types += [