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.24-cp314-cp314-win_amd64.whl (416.4 kB view details)

Uploaded CPython 3.14Windows x86-64

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

Uploaded CPython 3.14

easyorm_py-1.0.24-cp313-cp313-win_amd64.whl (405.6 kB view details)

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.13

easyorm_py-1.0.24-cp312-cp312-win_amd64.whl (411.1 kB view details)

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12

easyorm_py-1.0.24-cp311-cp311-win_amd64.whl (417.5 kB view details)

Uploaded CPython 3.11Windows x86-64

easyorm_py-1.0.24-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.24-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for easyorm_py-1.0.24-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 ab5b3591de878ecdbb45a7eea1aec58d6b915e711bd84d53024c6e191c274966
MD5 1f287e65fbac755b336b0243d1c1e2e3
BLAKE2b-256 0735741a100842861ae0692394bd83d9b2660d5f18ee98effb68c567dbbe4c69

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for easyorm_py-1.0.24-cp314-cp314-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ef59cc8345f7deb28c5ec2f2c849c46736dcee6b2a0d10c836c99b3e6f5cee8a
MD5 2c71d2e56060eea81b796a9c484c7059
BLAKE2b-256 a3a1c8c4da5b1c52286acb356f064ba250bf550efd9b7f3acb98cfac53fc66b9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for easyorm_py-1.0.24-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 8946357c5159fc7b00a9bcc3caa06809fe6109b3733979ab5f4e42164e103bd0
MD5 e7b814087c25e9bb566e5ae1d1a6965e
BLAKE2b-256 326eae3787b8cc489bcd3c1dcc5e8c69cf6eb6b6a1efc4c8335a05e4d63fdd95

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for easyorm_py-1.0.24-cp313-cp313-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5ef8cf9eeccf69c903a7d09570e7961eb2b437a07243c8446be09db57182a46d
MD5 db8cba56b5ca26adcdaeb1ae56be616e
BLAKE2b-256 188d74449e9c78f3d99711611a6674b497b24ba347b1bc9151b114165856b21c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for easyorm_py-1.0.24-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 4c89771da161692491d476e32e42399c9dda39ccde3d721876354f2025391053
MD5 1cf96c90be31aef3f32522b837147d52
BLAKE2b-256 e5a56a85632f4d41b4c6b3bcf7b1931d850924174e578f233941c67d4348942c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for easyorm_py-1.0.24-cp312-cp312-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1cbcd79087e813b013cd89f7789825eecc85f1fb0984c9a1c62d578281f626bb
MD5 ad324d574699ac5103e4cf8f1a0f04d6
BLAKE2b-256 e86bd98da297442cfb250e47c7d6badb8ca6218c053559a9f1cdb9cdc0170afb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for easyorm_py-1.0.24-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 d1d2c06150474c80d17d3c2ecdc437258d829e6d2ca8b88d0c0098dfa79a19e9
MD5 49d135f480466c11c422da5b31b631ba
BLAKE2b-256 350513e26bcfb8d2702496dd5bc039c3522117b95dc109c02d5312b80b375a8e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for easyorm_py-1.0.24-cp311-cp311-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2feb2abd792227e93e5b4680d072e3d788acbb2dce0415398b4824bd5e1b121e
MD5 6d96d7077e562fb5f9313c8adc3e3b0b
BLAKE2b-256 a4219a25326c36e795d2da4761a58a48e979554bda6903604a04ee72330ecaaf

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