threepp
A cross-platform C++20 3D library with Python bindings and the high-level API of three.js.
A Pythonic ORM for querying data warehouse semantic views.
Translation pending
Developer toolsPython · JinjaGitHub @s-layerOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗[ Docs ]
The ORM for your Semantic Layer.
Typed models in Python, supporting IDE autocomplete, and a Django-like fluent query interface for the semantic layer of your data warehouse backend.
pip install semolina
pip install "semolina[snowflake]"
pip install "semolina[databricks]"
A model maps to a semantic view in your warehouse.
from semolina import (
SemanticView,
Metric,
Dimension,
)
class Sales(SemanticView, view="sales"):
revenue = Metric()
cost = Metric()
country = Dimension()
region = Dimension()
Semolina needs an engine to talk to your warehouse. An engine owns one connection pool and the dialect for a backend. Build one with create_engine and register it before running any queries:
from semolina import create_engine, register
engine = create_engine(
"default"
) # reads [connections.default] from .semolina.toml
register("default", engine)
Use Model.query() to start building. Chain .metrics() and .dimensions() to select the fields you want, then call .execute():
query = (
Sales.query()
.metrics(Sales.revenue)
.dimensions(Sales.country)
)
.execute() returns a SemolinaCursor. Use it as a context manager so the pooled connection is released when you are done, and call .fetchall_rows() to get Row objects that support both attribute and dict-style access:
with query.execute() as cursor:
for row in cursor.fetchall_rows():
print(row.country, row.revenue) # attribute access
print(row["country"]) # dict-style access
You should see output like:
CA 2000
CA
US 1500
US