Giter VIP home page Giter VIP logo

typedal's Introduction

TypeDAL

PyPI - Version PyPI - Python Version
Code style: black License: MIT
su6 checks coverage.svg

Typing support for PyDAL. This package aims to improve the typing support for PyDAL. By using classes instead of the define_table method, type hinting the result of queries can improve the experience while developing. In the background, the queries are still generated and executed by pydal itself, this package only provides some logic to properly pass calls from class methods to the underlying db.define_table pydal Tables.

  • TypeDAL is the replacement class for DAL that manages the code on top of DAL.
  • TypedTable must be the parent class of any custom Tables you define (e.g. class SomeTable(TypedTable))
  • TypedField can be used instead of Python native types when extra settings (such as default) are required ( e.g. name = TypedField(str, default="John Doe")). It can also be used in an annotation (name: TypedField[str]) to improve editor support over only annotating with str.
  • TypedRows: can be used as the return type annotation of pydal's .select() and subscribed with the actual table class, so e.g. rows: TypedRows[SomeTable] = db(...).select(). When using the QueryBuilder, a TypedRows instance is returned by .collect().

Version 2.0 also introduces more ORM-like funcionality. Most notably, a Typed Query Builder that sees your table classes as models with relationships to each other. See 3. Building Queries for more details.

CLI

The Typedal CLI provides a convenient interface for generating SQL migrations for edwh-migrate from PyDAL or TypeDAL configurations using pydal2sql. It offers various commands to streamline database management tasks.

Usage

typedal --help

Options

  • --show-config: Toggle to show configuration details. Default is no-show-config.
  • --version: Toggle to display version information. Default is no-version.
  • --install-completion: Install completion for the current shell.
  • --show-completion: Show completion for the current shell, for copying or customization.
  • --help: Display help message and exit.

Commands

  • cache.clear: Clear expired items from the cache.
  • cache.stats: Show caching statistics.
  • migrations.fake: Mark one or more migrations as completed in the database without executing the SQL code.
  • migrations.generate: Run pydal2sql based on the TypeDAL configuration.
  • migrations.run: Run edwh-migrate based on the TypeDAL configuration.
  • setup: Interactively setup a [tool.typedal] entry in the local pyproject.toml.

Configuration

TypeDAL and its CLI can be configured via pyproject.toml.
See 6. Migrations for more information about configuration.

TypeDAL for PyDAL users - Quick Overview

Below you'll find a quick overview of translation from pydal to TypeDAL.
For more info, see the docs.


Translations from pydal to typedal

Description pydal typedal typedal alternative(s) ...
Setup
from pydal import DAL, Field

db = DAL(...)
from typedal import TypeDAL, TypedTable, TypedField

db = TypeDAL(...)
Table Definitions
db.define_table("table_name",
                Field("fieldname", "string", required=True),
                Field("otherfield", "float"),
                Field("yet_another", "text", default="Something")
                )
@db.define
class TableName(TypedTable):
    fieldname: str
    otherfield: float | None
    yet_another = TypedField(str, type="text", default="something", required=False)
import typing


class TableName(TypedTable):
    fieldname: TypedField[str]
    otherfield: TypedField[typing.Optional[float]]
    yet_another = TextField(default="something", required=False)


db.define(TableName)
Insert
db.table_name.insert(fieldname="value")
TableName.insert(fieldname="value")
# the old syntax is also still supported:
db.table_name.insert(fieldname="value")
(quick) Select
# all:
all_rows = db(db.table_name).select()  # -> Any (Rows)
# some:
rows = db((db.table_name.id > 5) & (db.table_name.id < 50)).select(db.table_name.id)
# one:
row = db.table_name(id=1)  # -> Any (Row)
# all:
all_rows = TableName.collect()  # or .all()
# some:
# order of select and where is interchangable here
rows = TableName.select(Tablename.id).where(TableName.id > 5).where(TableName.id < 50).collect()
# one:
row = TableName(id=1)  # or .where(...).first()
# you can also still use the old syntax and type hint on top of it;
# all:
all_rows: TypedRows[TableName] = db(db.table_name).select()
# some:
rows: TypedRows[TableName] = db((db.table_name.id > 5) & (db.table_name.id < 50)).select(db.table_name.id)
# one:
row: TableName = db.table_name(id=1)

All Types

See 2. Defining Tables

Caveats

  • This package depends heavily on the current implementation of annotations (which are computed when the class is defined). PEP 563 (Postponed Evaluation of Annotations, accepted) aims to change this behavior ( and from __future__ import annotations already does) in a way that this module currently can not handle: all annotations are converted to string representations. This makes it very hard to re-evaluate the annotation into the original type, since the variable scope is lost (and thus references to variables or other classes are ambiguous or simply impossible to find).
  • TypedField limitations; Since pydal implements some magic methods to perform queries, some features of typing will not work on a typed field: typing.Optional or a union (Field() | None) will result in errors. The only way to make a typedfield optional right now, would be to set required=False as an argument yourself. This is also a reason why typing.get_type_hints is not a solution for the first caveat.

typedal's People

Contributors

robinvandernoord avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

Forkers

mbelletti

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.