Skip to content

Commit da2efd8

Browse files
authored
Merge pull request #97 from bmeares/chunking
Added `test_pandas.py` to the `pytest` suite.
2 parents 21200d1 + 8e9e59b commit da2efd8

File tree

5 files changed

+180
-28
lines changed

5 files changed

+180
-28
lines changed

.pre-commit-config.yaml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,6 @@ repos:
4242
rev: '3.9.2' # pick a git hash / tag to point to
4343
hooks:
4444
- id: flake8
45-
additional_dependencies:
46-
- flake8-aaa
4745
args:
4846
- --jobs=1
4947
- --extend-ignore=W503,E203,E501

duckdb_engine/__init__.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ class ConnectionWrapper:
2020
def cursor(self):
2121
return self
2222

23+
def fetchmany(self, size=None):
24+
# TODO: remove this once duckdb supports fetchmany natively
25+
return self.c.fetch_df_chunk().values.tolist()
26+
2327
def __getattr__(self, name):
2428
return getattr(self.c, name)
2529

@@ -31,8 +35,11 @@ def close(self):
3135
# duckdb doesn't support 'soft closes'
3236
pass
3337

34-
def execute(self, statement, parameters, context):
35-
self.c.execute(statement, parameters)
38+
def execute(self, statement, parameters=None, context=None):
39+
if parameters is None:
40+
self.c.execute(statement)
41+
else:
42+
self.c.execute(statement, parameters)
3643

3744

3845
class Dialect(postgres_dialect):

duckdb_engine/tests/test_pandas.py

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
#! /usr/bin/env python3
2+
# vim:fenc=utf-8
3+
4+
"""
5+
Test pandas functionality.
6+
"""
7+
8+
from collections import OrderedDict
9+
from datetime import datetime
10+
from itertools import product
11+
from typing import Optional
12+
13+
import pandas as pd
14+
from pytest import mark
15+
from sqlalchemy import create_engine
16+
17+
_possible_args = OrderedDict(
18+
{
19+
"chunksize": [None, 1, 10000],
20+
"if_exists": ["fail", "replace", "append"],
21+
"method": [
22+
None,
23+
"multi",
24+
], # TODO Implement a callable insert method?
25+
}
26+
)
27+
28+
args = {
29+
"to_sql": ["chunksize", "if_exists", "method"],
30+
"read_sql": ["chunksize"],
31+
}
32+
params = {
33+
k: list(
34+
product(*(_v for _k, _v in _possible_args.items() if _k in args[k])) # type: ignore
35+
)
36+
for k in args
37+
}
38+
params_strings = {k: (",".join([str(_k) for _k in args[k]])) for k in args}
39+
40+
sample_df = pd.DataFrame(
41+
{
42+
"datetime": [datetime.utcnow()],
43+
"int": [1],
44+
"float": [1.01],
45+
"str": ["foo"],
46+
}
47+
)
48+
49+
50+
@mark.parametrize(params_strings["to_sql"], params["to_sql"])
51+
def test_to_sql(
52+
chunksize: Optional[int],
53+
if_exists: str,
54+
method: Optional[str],
55+
index: bool = False,
56+
):
57+
eng = create_engine("duckdb:///:memory:")
58+
try:
59+
sample_df.to_sql(
60+
name="foo",
61+
con=eng,
62+
if_exists=if_exists,
63+
chunksize=chunksize,
64+
index=index,
65+
)
66+
except ValueError as e:
67+
if if_exists != "fail":
68+
raise e
69+
70+
71+
@mark.parametrize(params_strings["read_sql"], params["read_sql"])
72+
def test_read_sql(
73+
chunksize: Optional[int],
74+
):
75+
eng = create_engine("duckdb:///:memory:")
76+
sample_df.to_sql(name="test_read", con=eng, if_exists="replace")
77+
query = "SELECT * FROM test_read"
78+
result = pd.read_sql(
79+
query,
80+
eng,
81+
chunksize=chunksize,
82+
)
83+
chunks = [result] if chunksize is None else [chunk for chunk in result]
84+
pd.concat(chunks).reset_index(drop=True)

poetry.lock

Lines changed: 86 additions & 24 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ pre-commit = "^2.13.0"
1818
pdbpp = "^0.10.2"
1919
mypy = "^0.910"
2020
hypothesis = "^6.14.1"
21+
pandas = "^1"
2122

2223
[tool.poetry.plugins."sqlalchemy.dialects"]
2324
duckdb = "duckdb_engine"

0 commit comments

Comments
 (0)