{"id":27755,"library":"fyrnheim","title":"Fyrnheim","description":"Fyrnheim is a typed Python entity framework and dbt alternative built on Pydantic + Ibis. It allows defining typed entities with Pydantic, generating transformations, and running them anywhere. Current version 0.14.0, active development.","status":"active","version":"0.14.0","language":"python","source_language":"en","source_url":"https://github.com/deepskydatahq/fyrnheim","tags":["dbt-alternative","entity-framework","pydantic","ibis","data-transformation"],"install":[{"cmd":"pip install fyrnheim","lang":"bash","label":"Install latest"}],"dependencies":[{"reason":"Core query generation uses Ibis expressions","package":"ibis-framework","optional":false},{"reason":"Entity definitions are Pydantic models","package":"pydantic","optional":false}],"imports":[{"note":"","wrong":"","symbol":"Entity","correct":"from fyrnheim import Entity"},{"note":"","wrong":"","symbol":"Ingestor","correct":"from fyrnheim import Ingestor"},{"note":"Direct import from fyrnheim, not fyrnheim.events","wrong":"","symbol":"EventSource","correct":"from fyrnheim import EventSource"}],"quickstart":{"code":"import os\nimport pandas as pd\nfrom fyrnheim import Entity, Ingestor\n\nclass User(Entity):\n    id: int\n    name: str\n    email: str\n\ndf = pd.DataFrame([\n    {\"id\": 1, \"name\": \"Alice\", \"email\": \"alice@example.com\"},\n])\ningestor = Ingestor(target=os.environ.get('DATABASE_URL', 'sqlite://'))\ningestor.ingest(User, df)\nprint(\"Ingestion complete\")","lang":"python","description":"Defines a User entity and ingests a pandas DataFrame into a database via Ingestor."},"warnings":[{"fix":"Replace `derive()` calls with `transform()`.","message":"The old `Entity.derive()` method has been deprecated in favor of the new transformation API using `Entity.transform()`.","severity":"deprecated","affected_versions":">=0.9.0,<0.14.0"},{"fix":"Ensure your data sources are accessible from the Ibis backend (e.g., BigQuery, DuckDB).","message":"Event source loading now composes Ibis expressions and uses UNION ALL. Previously, it materialized sources locally. If you relied on pandas-only behavior, your pipeline may break.","severity":"gotcha","affected_versions":">=0.14.0"},{"fix":"Pass a connection string (e.g., 'sqlite:///db.sqlite') instead of an engine object.","message":"The `Ingestor` class signature changed: `target` parameter now expects a connection string instead of a SQLAlchemy engine.","severity":"breaking","affected_versions":">=0.10.0"}],"env_vars":null,"last_verified":"2026-05-09T00:00:00.000Z","next_check":"2026-08-07T00:00:00.000Z","problems":[{"fix":"Use `Entity.transform()` instead of `derive_entity()`.","cause":"API changed; derive functionality moved to Entity.transform()","error":"AttributeError: module 'fyrnheim' has no attribute 'derive_entity'"},{"fix":"Use `ibis.memtable(df)` to convert pandas DataFrames to Ibis tables before passing to Fyrnheim.","cause":"Passing a pandas DataFrame directly to Ibis operations without conversion","error":"ibis.common.exceptions.IbisError: Expression type 'Table' is not supported"}],"ecosystem":"pypi","meta_description":null,"install_score":null,"install_tag":null,"quickstart_score":null,"quickstart_tag":null}