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 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:
        """

    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 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
        """

        
    
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_ori_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_ori_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.16-cp313-cp313-win_amd64.whl (442.8 kB view details)

Uploaded CPython 3.13Windows x86-64

easyorm_py-1.0.16-cp313-cp313-manylinux2014_x86_64.whl (3.0 MB view details)

Uploaded CPython 3.13

easyorm_py-1.0.16-cp312-cp312-win_amd64.whl (449.3 kB view details)

Uploaded CPython 3.12Windows x86-64

easyorm_py-1.0.16-cp312-cp312-manylinux2014_x86_64.whl (3.1 MB view details)

Uploaded CPython 3.12

easyorm_py-1.0.16-cp311-cp311-win_amd64.whl (458.4 kB view details)

Uploaded CPython 3.11Windows x86-64

easyorm_py-1.0.16-cp311-cp311-manylinux2014_x86_64.whl (3.1 MB view details)

Uploaded CPython 3.11

File details

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

File metadata

File hashes

Hashes for easyorm_py-1.0.16-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 70615e29bed892cd4c8d67daa48ffbe9828a367ca58f4a806e31254cde51200a
MD5 701c279bbf77bd63d609cb29e6dc2f69
BLAKE2b-256 f07228cd13ba34d78eaf47dc21c439392f1977f7bb548b926c03f92ac7613c28

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for easyorm_py-1.0.16-cp313-cp313-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7454a3bac17bd0b7ba4fe956b3ea95d00fd08350ebfe21c14a9eea186be92940
MD5 4f156e4c77c3a753e46ec7ee4d64d75b
BLAKE2b-256 e11d943c26b136046578896c61b4a5321bc94a6efeb3206d440abe15a9cb2ad9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for easyorm_py-1.0.16-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 b7c08fdf2b2bd646f463d769133459e97b6a80324918606f49fd1a0727a5c6dc
MD5 8ca60bbab219c88bc3ee6923a502f660
BLAKE2b-256 ab8618ad6b05d2bdea1f12f16846f90f5b91f6de176165f58fa4b762f01b0dd2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for easyorm_py-1.0.16-cp312-cp312-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 18ba88e7c7395d25f7b6fc4ab286b8d7f13be2d4601560836d8d4b927e69b4bf
MD5 7bc2a415eb8aff90a446a0e473720a54
BLAKE2b-256 52784e2049947be255fd58a910dba5b434b6bd3de798d856e64e05fd53366f82

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for easyorm_py-1.0.16-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 9afe47dc54186424c29f76c2515fa12eebe1f1de882d0368067159633f9bc8a6
MD5 4de4b4f0eafceca61e2fe4894ff214b0
BLAKE2b-256 b105f59c197af7f37686862b0a57715f3a9ba8b90894d0e56e9aec5fb7e0a8b0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for easyorm_py-1.0.16-cp311-cp311-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 09ecc085b14c8f2f04af19b32c9786e61637515d4a53344a56282718b8f96f87
MD5 69d379cbbb32a0d2a72edf34a021c7de
BLAKE2b-256 fd145e40af874b36362f3e4e6d867a3b44e56bcc567ca62baea2ee4ad61c1081

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