Skip to main content

easy_orm

Project description

example

1. Load db config

db_test = {
    "primary": "default",
    "raw_sql": True,
    "mapper_xml_path": "test_xml",
    "default": {
        "db_type": "mysql",
        "host": "127.0.0.1",
        "port": 3306,
        "user": "root",
        "password": "123456",
        "database": "template",
    },
    "test": {
        "db_type": "mysql",
        "host": "127.0.0.1",
        "port": 3306,
        "user": "root",
        "password": "123456",
        "database": "template",
    }
}

from easy_orm import EasyOrmConfig, DBConfig, DataSource
db_config = DBConfig(**db_test)
EasyOrmConfig(db_config)


# add datasource
ds = {
    "test_ds": DataSource(
        db_type="mysql",
        host="127.0.0.1",
        port=3306,
        user="root",
        password="123456",
        database="test_ds"
    )
}
EasyOrmConfig.add_datasource_config(ds)

# remove
EasyOrmConfig.remove_datasource("test_ds")

2. edit xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "">
<mapper namespace="TestMapper">

    <select id="find_data_by_ids">
        select id, username from test where id in
        <foreach collection="id_list" item="id" open="(" close=")" separator=",">
            #{id}
        </foreach>
    </select>

    <select id="test_page">
        select id, username from test
    </select>

    <select id="test_where" resultType="model.user.User">

        select id, username from test

        <where>
            <if test="params.get('id') is not None">
                id = #{id}
            </if>
        </where>

    </select>

    <insert id="add_data">
        insert into test (nickname, username) values ('xxx', 'xxx1')
    </insert>


    <update id="update_data_by_id">
        update test set nickname = #{nickname} where id = #{id}
    </update>


    <delete id="delete_data_by_id">
        delete from test where id = #{id}
    </delete>

</mapper>

3. Extend BaseMapper and Use

# TestMapper.py
from contextlib import contextmanager
from sqlalchemy.sql.selectable import Select
from sqlalchemy.sql.dml import Delete, Update
from easy_orm import Page


class BaseMapper(Generic[T]):


    @classmethod
    @contextmanager
    def db_session(cls, datasource_name:str=None):
        """
        get ori db session
        :param datasource_name:
        :return:
        """

    @classmethod
    @contextmanager
    def switch_datasource(cls, datasource_name: str):
        """
        switch_datasource by datasource_name
        :param datasource_name:
        :return:
        """
        
        
    def add(self, data: Any):
        """
        add
        :param data:
        :return:
        """


    def add_all(self, data: list):
        """
        add_all
        :param data:
        :return:
        """
        
    def save_batch(self, data: list):
        """
        save_batch  orm2.0
        :param data:
        :return:
        """
        
    def insert(self, data: Any):
        """
        insert  orm2.0
        :param data:
        :return:
        """
    
    
    def delete_by_id(self, id: int):
        """
        delete by id
        :param id: int
        :return: rows
        """
    
    def delete(self, del_statement: Delete):
        """
        delete orm 2.0 statement
        :param del_statement: 
        :return: rows
        """
    
    def update_by_id(self, data: dict, selective: bool = False):
        """
        update by id
        :param data: dict
        :param selective: bool
        :return: rows
        """
    
    def update(self, update: Update):
        """
        update orm 2.0 statement
        :param update: 
        :return: rows
        """
    
    def bulk_update_mappings(self, table_model=None, data_list: list[dict]|None=None):
        """
        update orm2.0 or origin_sql statement
        :param table_model:
        :param data_list:
        :return:
        """
        
    def select_page_by_orm(self, statement: Select, page: Page=Page(1, 10)):
        """

        :param statement: Select    statement
        :param page: Page           Page(1, 10)
        :return: {"list": [], "total": 0}
        """

    def select_page_by_ori_sql(self, sql_str: str, sql_param: dict | None=None, page: Page=Page(1, 10)):
        """
        :param sql_str: str         ori_sql
        :param sql_param: dict      {}
        :param page: Page           Page(1, 10)
        :return: {"list": [], "total": 0}
        """

    def select_all_by_ori_sql(self, sql_str: str, sql_param: dict | None=None):
        """
        :param sql_str: str         ori_sql
        :param sql_param: dict      {}
        :return: []
        """
        
        
    def select_all(self, statement=None):
        """
        select all
        :param statement:
        :return:
        """

    def select_one(self, statement=None):
        """
        select one
        :param statement:
        :return:
        """
        

    def select_by_id(self, id: int):
        """
        select by id
        :param id:
        :return:
        """



        
    
from sqlalchemy import select, update, delete, text
from easy_orm import BaseMapper, Page, select_one, delete, datasource, db_session, EasyOrmConfig
from model.user import User, UserModel

class TestMapper(BaseMapper[UserModel]):

    def find_data_by_ids(self, id_list: list): ...

    @select_one('select * from test where id = #{id}')
    def find_data_one(self, id: int): ...

    def test_page(self, page: Page): ...

    def test_where(self, id: int) -> list[UserModel]: ...

    def add_data(self): ...

    def update_data_by_id(self, nickname: str, id: int): ...

    @delete('delete from test where id = #{id}')
    def delete_data_by_id2(self, id: int): ...
    
    
    def select_page_orm_test(self):
        page = Page(1, 10)
        stat = select(UserModel).where(UserModel.id > 1)
        return self.select_page_by_orm(stat, page)

    def select_page_ori_sql_test(self):
        page = Page(1, 10)
        sql_str = "select * from user where id > :id"
        return self.select_page_by_sql(sql_str, {"id": 1}, page)

    def select_all_ori_sql_test(self):
        sql_str = "select * from user where id > :id"
        return self.select_all_by_sql(sql_str, {"id": 1})
    
    def delete_test(self):
        stat = delete(UserModel).where(UserModel.id == 1)
        return self.delete(stat)
    
    def update_test(self):
        stat = update(UserModel).where(UserModel.id == 1).values(name="test")
        return self.update(stat)
    

class TestService:

    @datasource("default", True)
    def test_find_user_one(self):
        TestMapper().find_data_one(1)
        self.test_find_user_one2()

    @datasource("test", True)
    def test_find_user_one2(self):
        TestMapper().find_data_one(1)
    
    def test(self):
        id = TestMapper().insert({"field": "test"})
        TestMapper().select_by_id(1)
        TestMapper().update_by_id({'id': 1, "field": "test2"})
        TestMapper().delete_by_id(1)
    
    def test_ori_session(self):
        with db_session() as session:
            d = session.execute(text("select * from user")).first()
            print(d._asdict())

    def test_add_source(self):
        with TestMapper.switch_datasource("test_ds"):
            TestMapper().select_by_id(1)

        
if __name__ == '__main__':
    
    EasyOrmConfig.add_datasource_config(ds)

    # remove
    EasyOrmConfig.remove_datasource("test_ds")
    
    test_service = TestService()
    test_service.test_find_user_one()
    
    test_mapper = TestMapper()
    test_mapper.find_data_by_ids([1, 2, 3])

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

easyorm_py-1.0.26-cp314-cp314-win_amd64.whl (417.5 kB view details)

Uploaded CPython 3.14Windows x86-64

easyorm_py-1.0.26-cp314-cp314-manylinux2014_x86_64.whl (3.1 MB view details)

Uploaded CPython 3.14

easyorm_py-1.0.26-cp313-cp313-win_amd64.whl (406.2 kB view details)

Uploaded CPython 3.13Windows x86-64

easyorm_py-1.0.26-cp313-cp313-manylinux2014_x86_64.whl (3.2 MB view details)

Uploaded CPython 3.13

easyorm_py-1.0.26-cp312-cp312-win_amd64.whl (411.7 kB view details)

Uploaded CPython 3.12Windows x86-64

easyorm_py-1.0.26-cp312-cp312-manylinux2014_x86_64.whl (3.3 MB view details)

Uploaded CPython 3.12

easyorm_py-1.0.26-cp311-cp311-win_amd64.whl (418.1 kB view details)

Uploaded CPython 3.11Windows x86-64

easyorm_py-1.0.26-cp311-cp311-manylinux2014_x86_64.whl (3.2 MB view details)

Uploaded CPython 3.11

File details

Details for the file easyorm_py-1.0.26-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for easyorm_py-1.0.26-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 2bc45e7df481b7f23a3da45a9c0c67e63f2e36c6d0632d1997261487ec8d0921
MD5 aaa105438938249810f22f8ac1b6cc70
BLAKE2b-256 0d8a15dbc6d21ca6f433f607a2d3146de5c4bf91faec48ecc89bab4a5c811c03

See more details on using hashes here.

File details

Details for the file easyorm_py-1.0.26-cp314-cp314-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for easyorm_py-1.0.26-cp314-cp314-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5f9606ed1fac219ed75822e9512d7e69a8d09da2dd5323a2f5d8415af8a649c8
MD5 db544d1b24e0c5dbeede333dea1c5df6
BLAKE2b-256 c5d47133735f04d08bd53524ab228e2b540f5e0e634459465b119aba99b0807c

See more details on using hashes here.

File details

Details for the file easyorm_py-1.0.26-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for easyorm_py-1.0.26-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 2300808f85cf8429529c91b9b96efc31b85fe9da27770822efbb28bdb3cc8488
MD5 dbc31acd330b96eb2ff74345b3eb6a00
BLAKE2b-256 6e3b56421bc81ed85993d80159eb03052215088ccc9edbd2957db913831544aa

See more details on using hashes here.

File details

Details for the file easyorm_py-1.0.26-cp313-cp313-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for easyorm_py-1.0.26-cp313-cp313-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e95675eb275db48d7abcf708e05e3471109aeeae89e8c2eb9d5b40e8a5da9121
MD5 3465ba9d17b99686702aafb1cb156d69
BLAKE2b-256 5fc4c2df143e72dafc37b5d97a11646cd5678126f33b1820b21a6dbfb79f810a

See more details on using hashes here.

File details

Details for the file easyorm_py-1.0.26-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for easyorm_py-1.0.26-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 3d49f32421e68ede03db20f1221dc4d4c65fd0be886ff8fc40366f8712d6ea89
MD5 85b97fce6eb60d98d706139dd4111667
BLAKE2b-256 fd9755b5258b5d864305ea9966fcaf99574e79308ce8d152e1d244f074d03f1c

See more details on using hashes here.

File details

Details for the file easyorm_py-1.0.26-cp312-cp312-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for easyorm_py-1.0.26-cp312-cp312-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7da9864144e3c5ba53904096cfe49566e91f2b0617880beb429c0549c55daccf
MD5 8d1f6500f02bc2642cd52e834c9a18ee
BLAKE2b-256 aca21cc58811d6738bf8c5734df86e14f95371d9d65b71f931be8068629008ac

See more details on using hashes here.

File details

Details for the file easyorm_py-1.0.26-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for easyorm_py-1.0.26-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 ecae8a0a0aeed2dd9564e9174061fe4c82de645d58c5f12cac14675fe84447ea
MD5 4be8da7f329a33a8a1e5bf4f146702db
BLAKE2b-256 ee59c5432db89c9a569bda10646a4fc30c89dd5ed04947cf04b2dd6f0d3ad84e

See more details on using hashes here.

File details

Details for the file easyorm_py-1.0.26-cp311-cp311-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for easyorm_py-1.0.26-cp311-cp311-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4d17b0f0c1fafe4b30552e9718a2906f4c8e65aba2c4c961c636340c0763a393
MD5 f811cc5fd939cc302cd0bfabaf25fef3
BLAKE2b-256 dfdccb7432829a7a8aadf6b9585d1cee2b10ebb9f7bb38b7ce7992b4f80f53a2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page