Fake Snowflake Connector for Python. Run and mock Snowflake DB locally.
pip install fakesnow
Run script.py with fakesnow:
fakesnow script.py
Or a module, eg: pytest
fakesnow -m pytest
fakesnow
executes fakesnow.patch
before running the script or module.
To use fakesnow within your code:
import fakesnow
import snowflake.connector
with fakesnow.patch():
conn = snowflake.connector.connect()
print(conn.cursor().execute("SELECT 'Hello fake world!'").fetchone())
The following imports are automatically patched:
import snowflake.connector.connect
import snowflake.connector.pandas_tools.write_pandas
To patch modules that use the from ... import
syntax, manually specify them, eg: if mymodule.py has the import:
from snowflake.connector.pandas_tools import write_pandas
Then patch it using:
with fakesnow.patch("mymodule.write_pandas"):
...
By default databases are in-memory. To persist databases between processes, specify a databases path:
with fakesnow.patch(db_path="databases/"):
...
pytest fixtures are provided for testing. Example conftest.py:
from typing import Iterator
import fakesnow.fixtures
import pytest
pytest_plugins = fakesnow.fixtures.__name__
@pytest.fixture(scope="session", autouse=True)
def setup(_fakesnow_session: None) -> Iterator[None]:
# the standard imports are now patched
...
yield
Or with from ... import
patch targets:
from typing import Iterator
import fakesnow
import pytest
@pytest.fixture(scope="session", autouse=True)
def _fakesnow_session() -> Iterator[None]:
with fakesnow.patch("mymodule.write_pandas"):
yield
- cursors and standard SQL
- get_result_batches()
- information schema
- multiple databases
- parameter binding
- table comments
- write_pandas(..)
- access control
- standalone/out of process api/support for faking non-python connectors
- stored procedures
Partial support
- date functions
- regex functions
- semi-structured data
- tags
For more detail see tests/test_fakes.py
- The order of rows is non deterministic and may not match Snowflake unless ORDER BY is fully specified.
- VARCHAR field sizes are not enforced. Unlike Snowflake which errors with "User character length limit (xxx) exceeded by string" when an inserted string exceeds the column limit.
See CONTRIBUTING.md to get started and develop in this repo.