FastaAPI's CRUD project generator for SQLALchemy.
Project description
Fastapi CRUD Project Generator
A code generator that help you to establish a fastapi project with CRUD router from your Sqlalchemy model. Which supports following api:
- Get one
- Get many
- Insert one
- Insert many
- Update one
- Update many
- Patch one
- Patch many
- Delete one
- Delete many
DEMO
Features
- CRUD router automatically generated - In generated project template, it support CRUD router code generation from Sqlalchemy declarative class definitions
- API validation Model generation - help you to generate the model that used for Fastapi router
- Customize / Add your own API - Based on the generated project template, you can add your own code such as your business logic or api router easelly.
- Support SQLAlchemy 1.4 - Allows you build a fully asynchronous or synchronous python service
- Support Pagination - Get many API support order by offset limit field in API
- Flexible API request - In generated project, UPDATE ONE/MANY FIND ONE/MANY PATCH ONE/MANY DELETE ONE/MANY supports Path Parameters (primary key) and Query Parameters as a command to the resource to filter and limit the scope of the scope of data in request.
Quick Start with in-memory DB (or see the other (example)
Install
pip install fastapi-crud-code-generator
Prepare your Sqlalchemy schema
- You can use sqlacodegen to generate SQLAlchemy models for your table. This project is based on the model development and testing generated by sqlacodegen
from sqlalchemy import *
from sqlalchemy.orm import declarative_base
Base = declarative_base()
metadata = Base.metadata
class SampleTable(Base):
__tablename__ = 'test_build_myself_memory'
__table_args__ = (
UniqueConstraint('primary_key', 'int4_value', 'float4_value'),
)
primary_key = Column(Integer, primary_key=True, autoincrement=True)
bool_value = Column(Boolean, nullable=False, default=False)
bytea_value = Column(LargeBinary)
char_value = Column(CHAR(10, collation='NOCASE'))
date_value = Column(Date)
float4_value = Column(Float, nullable=False)
float8_value = Column(Float(53), nullable=False, default=10.10)
int2_value = Column(SmallInteger, nullable=False)
int4_value = Column(Integer, nullable=False)
int8_value = Column(BigInteger, default=99)
text_value = Column(Text)
varchar_value = Column(String)
class SampleTableTwo(Base):
__tablename__ = 'test_build_myself_memory_two'
primary_key = Column(Integer, primary_key=True, autoincrement=True)
bool_value = Column(Boolean, nullable=False, default=False)
bytea_value = Column(LargeBinary)
Use crud_router_builder()
to generate the project to the executing folder (using in-memory sqlite db here)
from fastapi_quickcrud_codegen.db_model import DbModel
from fastapi_quickcrud_codegen.misc.type import CrudMethods
from fastapi_quickcrud_codegen import crud_router_builder
model_list = [DbModel(db_model=SampleTable, prefix="/my_first_api", tags=["sample api"],
exclude_columns=['bytea_value']),
DbModel(db_model=SampleTableTwo, prefix="/my_second_api", tags=["sample api"],
exclude_columns=['bytea_value'],crud_methods=[CrudMethods.FIND_ONE])]
crud_router_builder(
db_model_list=model_list,
# is_async=True,
# database_url="sqlite+aiosqlite://",
is_async=False,
database_url="sqlite://"
)
crud_router_builder args
-
db_model_list
[Required[List[DbModel]]]
Model list of dict for code generate
List[]
DbModel
- db_model
[Required[DeclarativeMeta]]
- prefix
[Required[str]]
prefix for Fastapi's end point
- tags
[Required[List[str]]]
list of tag for Fastapi's end point
- exclude_columns
[Optional[List[str]]]
set the columns that not to be operated but the columns should nullable or set the default value)
- crud_methods
[Opional[List[CrudMethods]]]
- Create the following apis for that model, but default: [CrudMethods.FIND_MANY, CrudMethods.FIND_ONE, CrudMethods.CREATE_MANY, CrudMethods.PATCH_ONE, CrudMethods.PATCH_MANY, CrudMethods.PATCH_ONE, CrudMethods.UPDATE_MANY, CrudMethods.UPDATE_ONE, CrudMethods.DELETE_MANY, CrudMethods.DELETE_ONE]
- CrudMethods.FIND_ONE - CrudMethods.FIND_MANY - CrudMethods.UPDATE_ONE - CrudMethods.UPDATE_MANY - CrudMethods.PATCH_ONE - CrudMethods.PATCH_MANY - CrudMethods.CREATE_ONE - CrudMethods.CREATE_MANY - CrudMethods.DELETE_ONE - CrudMethods.DELETE_MANY
- db_model
-
is_async
[Required]
True for async; False for sync
-
database_url
[Optional (str)]
A database URL. The URL is passed directly to SQLAlchemy's create_engine() method so please refer to SQLAlchemy's documentation for instructions on how to construct a proper URL.
Known limitations
- ❌ Please use composite unique constraints instead of multiple unique constraints
- ❌ Composite primary key is not supported
- ❌ Sqlalchemy table type model schema is not supported
Design:
The model generation part and api router part refer to my another project; The code generation part is using Jinja
How to contribute more apis?
It will be super excited if you have any idea with api router/ model template. then you can follow the step as below to try to contribute.
- Model generation
- Prepare Jinja template to
fastapi-crud-project-generator/src/fastapi_quickcrud_codegen/model/template
- Prepare model code generation method from
fastapi_quickcrud_codegen.utils.schema_builder.ApiParameterSchemaBuilder
- Generate the code from
fastapi_quickcrud_codegen/model/model_builder.py
- Prepare Jinja template to
- CRUD Method Generation
- After the model generation, you can try to build your own api by your own model
- Modify
fastapi_quickcrud_codegen.utils.sqlalchemy_to_pydantic.sqlalchemy_to_pydantic
,fastapi_quickcrud_codegen.misc.type.CrudMethods
andfastapi_quickcrud_codegen.misc.crud_model.CRUDModel
to let project supports your api - Prepare your api router Jinja template from
src/fastapi_quickcrud_codegen/model/template/route
- Generate the code from
fastapi_quickcrud_codegen/model/crud_builder.py
- Update the api_register from
src/fastapi_quickcrud_codegen/crud_generator.py
- use Sqlalchemy's sql.expression instead custom statement when building sql statement for your api
Road map
Current State: Stable
Will do:
- Support foreign tree in find api
- Support foreign tree in insert api
- Support foreign tree in update api
- Support foreign tree in delete api
Good to have:
- Support Sqlalchemy Table type model
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for fastapi-crud-code-generator-0.0.24.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | e1ff4fedf9e5e4fede6a0784e7f4a7bcfb90198125f15badb3092eeb52f58455 |
|
MD5 | dd238d154f54a8b4eaa45149e63eb711 |
|
BLAKE2b-256 | 9b9d1907c2a65c34a2be464b5cca65e21d868e6390c1c7f1e183c2280fbaf624 |
Hashes for fastapi_crud_code_generator-0.0.24-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 300cafd217652c67dc0ae35f80c681ed91f32294bade9d7d59f9171ebbc7deda |
|
MD5 | 3253856391a72e19137020dc464010ce |
|
BLAKE2b-256 | 20f5bf4a35223acfb1653e0960a70c514809c1915e5c5abc48834779a9e0fff8 |