Skip to content

Commit 8528936

Browse files
committed
refs pandas-dev#21199. Fix code for SQLiteTable and unit-tests.
1 parent fce019b commit 8528936

File tree

2 files changed

+19
-38
lines changed

2 files changed

+19
-38
lines changed

pandas/io/sql.py

+9-12
Original file line numberDiff line numberDiff line change
@@ -574,7 +574,7 @@ def create(self):
574574
else:
575575
self._execute_create()
576576

577-
def _exec_insert(self, conn, keys, data_iter):
577+
def _execute_insert(self, conn, keys, data_iter):
578578
"""Execute SQL statement inserting data
579579
580580
Parameters
@@ -585,7 +585,7 @@ def _exec_insert(self, conn, keys, data_iter):
585585
data = [{k: v for k, v in zip(keys, row)} for row in data_iter]
586586
conn.execute(self.table.insert(), data)
587587

588-
def _exec_insert_multi(self, conn, keys, data_iter):
588+
def _execute_insert_multi(self, conn, keys, data_iter):
589589
"""Alternative to _exec_insert for DBs that support multivalue INSERT.
590590
591591
Note: multi-value insert is usually faster for a few columns
@@ -594,7 +594,7 @@ def _exec_insert_multi(self, conn, keys, data_iter):
594594
data = [{k: v for k, v in zip(keys, row)} for row in data_iter]
595595
conn.execute(self.table.insert(data))
596596

597-
def _exec_insert_copy(self, conn, keys, data_iter):
597+
def _execute_insert_copy(self, conn, keys, data_iter):
598598
"""Alternative to _exec_insert for DBs that support COPY FROM
599599
"""
600600
# gets a DBAPI connection that can provide a cursor
@@ -615,7 +615,6 @@ def _exec_insert_copy(self, conn, keys, data_iter):
615615
table_name, columns)
616616
cur.copy_expert(sql=sql, file=s_buf)
617617

618-
619618
def insert_data(self):
620619
if self.index is not None:
621620
temp = self.frame.copy()
@@ -652,16 +651,15 @@ def insert_data(self):
652651

653652
return column_names, data_list
654653

655-
656654
def insert(self, chunksize=None, method=None):
657655

658656
# set insert method
659657
if method in (None, 'default'):
660-
exec_insert = self._exec_insert
658+
exec_insert = self._execute_insert
661659
elif method == 'multi':
662-
exec_insert = self._exec_insert_multi
660+
exec_insert = self._execute_insert_multi
663661
elif method == 'copy':
664-
exec_insert = self._exec_insert_copy
662+
exec_insert = self._execute_insert_copy
665663
else:
666664
# TODO: support callables?
667665
raise ValueError('Invalid parameter `method`: {}'.format(method))
@@ -690,8 +688,6 @@ def insert(self, chunksize=None, method=None):
690688
chunk_iter = zip(*[arr[start_i:end_i] for arr in data_list])
691689
exec_insert(conn, keys, chunk_iter)
692690

693-
694-
695691
def _query_iterator(self, result, chunksize, columns, coerce_float=True,
696692
parse_dates=None):
697693
"""Return generator through chunked result set."""
@@ -1487,7 +1483,8 @@ def _fetchall_as_list(self, cur):
14871483
return result
14881484

14891485
def to_sql(self, frame, name, if_exists='fail', index=True,
1490-
index_label=None, schema=None, chunksize=None, dtype=None):
1486+
index_label=None, schema=None, chunksize=None, dtype=None,
1487+
method=None):
14911488
"""
14921489
Write records stored in a DataFrame to a SQL database.
14931490
@@ -1531,7 +1528,7 @@ def to_sql(self, frame, name, if_exists='fail', index=True,
15311528
if_exists=if_exists, index_label=index_label,
15321529
dtype=dtype)
15331530
table.create()
1534-
table.insert(chunksize)
1531+
table.insert(chunksize, method)
15351532

15361533
def has_table(self, name, schema=None):
15371534
# TODO(wesm): unused?

pandas/tests/io/test_sql.py

+10-26
Original file line numberDiff line numberDiff line change
@@ -372,12 +372,16 @@ def _read_sql_iris_named_parameter(self):
372372
iris_frame = self.pandasSQL.read_query(query, params=params)
373373
self._check_iris_loaded_frame(iris_frame)
374374

375-
def _to_sql(self):
375+
def _to_sql(self, method=None):
376376
self.drop_table('test_frame1')
377377

378-
self.pandasSQL.to_sql(self.test_frame1, 'test_frame1')
378+
self.pandasSQL.to_sql(self.test_frame1, 'test_frame1', method=method)
379379
assert self.pandasSQL.has_table('test_frame1')
380380

381+
num_entries = len(self.test_frame1)
382+
num_rows = self._count_rows('test_frame1')
383+
assert num_rows == num_entries
384+
381385
# Nuke table
382386
self.drop_table('test_frame1')
383387

@@ -1180,7 +1184,7 @@ def setup_connect(self):
11801184
pytest.skip(
11811185
"Can't connect to {0} server".format(self.flavor))
11821186

1183-
def test_aread_sql(self):
1187+
def test_read_sql(self):
11841188
self._read_sql_iris()
11851189

11861190
def test_read_sql_parameter(self):
@@ -1204,6 +1208,9 @@ def test_to_sql_replace(self):
12041208
def test_to_sql_append(self):
12051209
self._to_sql_append()
12061210

1211+
def test_to_sql_method_multi(self):
1212+
self._to_sql(method='multi')
1213+
12071214
def test_create_table(self):
12081215
temp_conn = self.connect()
12091216
temp_frame = DataFrame(
@@ -1665,29 +1672,6 @@ class Temporary(Base):
16651672

16661673
tm.assert_frame_equal(df, expected)
16671674

1668-
def test_insert_multivalues(self):
1669-
# issues addressed
1670-
# https://github.com/pandas-dev/pandas/issues/14315
1671-
# https://github.com/pandas-dev/pandas/issues/8953
1672-
1673-
db = sql.SQLDatabase(self.conn)
1674-
df = DataFrame({'A': [1, 0, 0], 'B': [1.1, 0.2, 4.3]})
1675-
table = sql.SQLTable("test_table", db, frame=df)
1676-
data = [
1677-
{'A': 1, 'B': 0.46},
1678-
{'A': 0, 'B': -2.06}
1679-
]
1680-
statement = table.insert_statement(data, conn=self.conn)[0]
1681-
1682-
if self.supports_multivalues_insert:
1683-
assert statement.parameters == data, (
1684-
'insert statement should be multivalues'
1685-
)
1686-
else:
1687-
assert statement.parameters is None, (
1688-
'insert statement should not be multivalues'
1689-
)
1690-
16911675

16921676
class _TestSQLAlchemyConn(_EngineToConnMixin, _TestSQLAlchemy):
16931677

0 commit comments

Comments
 (0)