Skip to content

Commit 90842ba

Browse files
committed
ENH: explicit data type specifications for getting table schema from DataFrame
1 parent d09ac64 commit 90842ba

File tree

2 files changed

+15
-8
lines changed

2 files changed

+15
-8
lines changed

pandas/io/sql.py

+7-6
Original file line numberDiff line numberDiff line change
@@ -169,17 +169,17 @@ def write_frame(frame, name=None, con=None, flavor='sqlite'):
169169
data = [tuple(x) for x in frame.values]
170170
con.executemany(insert_sql, data)
171171

172-
def get_sqlite_schema(frame, name):
172+
def get_sqlite_schema(frame, name, dtypes=None):
173173
template = """
174174
CREATE TABLE %(name)s (
175175
%(columns)s
176176
);"""
177177

178178
column_types = []
179179

180-
dtypes = frame.dtypes
181-
for k in dtypes.index:
182-
dt = dtypes[k]
180+
frame_types = frame.dtypes
181+
for k in frame_types.index:
182+
dt = frame_types[k]
183183

184184
if issubclass(dt.type, (np.integer, np.bool_)):
185185
sqltype = 'INTEGER'
@@ -188,6 +188,9 @@ def get_sqlite_schema(frame, name):
188188
else:
189189
sqltype = 'TEXT'
190190

191+
if dtypes is not None:
192+
sqltype = dtypes.get(k, sqltype)
193+
191194
column_types.append((k, sqltype))
192195

193196
columns = ',\n '.join('%s %s' % x for x in column_types)
@@ -225,5 +228,3 @@ def format_query(sql, *args):
225228
processed_args.append(formatter(arg))
226229

227230
return sql % tuple(processed_args)
228-
229-

pandas/io/tests/test_sql.py

+8-2
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,14 @@ def test_execute(self):
5151
result.index = frame.index[:1]
5252
tm.assert_frame_equal(result, frame[:1])
5353

54-
54+
def test_schema(self):
55+
frame = tm.makeTimeDataFrame()
56+
create_sql = sql.get_sqlite_schema(frame, 'test', {'A': 'DATETIME'})
57+
lines = create_sql.splitlines()
58+
for l in lines:
59+
tokens = l.split(' ')
60+
if len(tokens) == 2 and tokens[0] == 'A':
61+
self.assert_(tokens[1] == 'DATETIME')
5562

5663
def test_execute_fail(self):
5764
create_sql = """
@@ -166,4 +173,3 @@ def test_uquery(self):
166173
# exit=False)
167174
nose.runmodule(argv=[__file__,'-vvs','-x','--pdb', '--pdb-failure'],
168175
exit=False)
169-

0 commit comments

Comments
 (0)