Skip to content

Commit f4e672c

Browse files
redbullpeterjorisvandenbossche
authored andcommitted
BUG: to_sql convert index name to string (#15404) (#15423)
* Converted index name to string to fix issue #15404 - BUG: to_sql errors with numeric index name - needs conversion to string * Additional int to string conversion added. Associated test cases added. * PEP 8 compliance edits * Removed extraneous brackets
1 parent c588dd1 commit f4e672c

File tree

2 files changed

+18
-2
lines changed

2 files changed

+18
-2
lines changed

pandas/io/sql.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -750,7 +750,8 @@ def _get_column_names_and_types(self, dtype_mapper):
750750
for i, idx_label in enumerate(self.index):
751751
idx_type = dtype_mapper(
752752
self.frame.index.get_level_values(i))
753-
column_names_and_types.append((idx_label, idx_type, True))
753+
column_names_and_types.append((text_type(idx_label),
754+
idx_type, True))
754755

755756
column_names_and_types += [
756757
(text_type(self.frame.columns[i]),
@@ -1220,7 +1221,7 @@ def _create_sql_schema(self, frame, table_name, keys=None, dtype=None):
12201221

12211222
def _get_unicode_name(name):
12221223
try:
1223-
uname = name.encode("utf-8", "strict").decode("utf-8")
1224+
uname = text_type(name).encode("utf-8", "strict").decode("utf-8")
12241225
except UnicodeError:
12251226
raise ValueError("Cannot convert identifier to UTF-8: '%s'" % name)
12261227
return uname

pandas/tests/io/test_sql.py

+15
Original file line numberDiff line numberDiff line change
@@ -709,6 +709,21 @@ def test_to_sql_index_label(self):
709709
self.assertEqual(frame.columns[0], 'other_label',
710710
"Specified index_label not written to database")
711711

712+
# index name is integer
713+
temp_frame.index.name = 0
714+
sql.to_sql(temp_frame, 'test_index_label', self.conn,
715+
if_exists='replace')
716+
frame = sql.read_sql_query('SELECT * FROM test_index_label', self.conn)
717+
self.assertEqual(frame.columns[0], '0',
718+
"Integer index label not written to database")
719+
720+
temp_frame.index.name = None
721+
sql.to_sql(temp_frame, 'test_index_label', self.conn,
722+
if_exists='replace', index_label=0)
723+
frame = sql.read_sql_query('SELECT * FROM test_index_label', self.conn)
724+
self.assertEqual(frame.columns[0], '0',
725+
"Integer index label not written to database")
726+
712727
def test_to_sql_index_label_multiindex(self):
713728
temp_frame = DataFrame({'col1': range(4)},
714729
index=MultiIndex.from_product(

0 commit comments

Comments
 (0)