Skip to content

Commit be98e46

Browse files
committed
ENH: primary key for sqlite schema
1 parent 95f30ca commit be98e46

File tree

2 files changed

+14
-3
lines changed

2 files changed

+14
-3
lines changed

pandas/io/sql.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -169,10 +169,10 @@ 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, dtypes=None):
172+
def get_sqlite_schema(frame, name, dtypes=None, keys=None):
173173
template = """
174174
CREATE TABLE %(name)s (
175-
%(columns)s
175+
%(columns)s%(keystr)s
176176
);"""
177177

178178
column_types = []
@@ -195,7 +195,12 @@ def get_sqlite_schema(frame, name, dtypes=None):
195195

196196
columns = ',\n '.join('%s %s' % x for x in column_types)
197197

198-
return template % {'name' : name, 'columns' : columns}
198+
keystr = ''
199+
if keys is not None:
200+
if isinstance(keys, basestring):
201+
keys = (keys,)
202+
keystr = ', PRIMARY KEY (%s)' % ','.join(keys)
203+
return template % {'name' : name, 'columns' : columns, 'keystr' : keystr}
199204

200205

201206

pandas/io/tests/test_sql.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,12 @@ def test_schema(self):
6060
if len(tokens) == 2 and tokens[0] == 'A':
6161
self.assert_(tokens[1] == 'DATETIME')
6262

63+
frame = tm.makeTimeDataFrame()
64+
create_sql = sql.get_sqlite_schema(frame, 'test', keys=['A', 'B'])
65+
lines = create_sql.splitlines()
66+
self.assert_('PRIMARY KEY (A,B)' in create_sql)
67+
self.db.execute(create_sql)
68+
6369
def test_execute_fail(self):
6470
create_sql = """
6571
CREATE TABLE test

0 commit comments

Comments
 (0)