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
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 Distributions
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file easyorm_py-1.0.21-cp313-cp313-win_amd64.whl.
File metadata
- Download URL: easyorm_py-1.0.21-cp313-cp313-win_amd64.whl
- Upload date:
- Size: 459.9 kB
- Tags: CPython 3.13, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
201bd9bfabf07e8144341a44b8f619902b38282030d422b96df86dfefd3ef6b6
|
|
| MD5 |
6b1f3d2e4e9dcb67803235b90ea47ef5
|
|
| BLAKE2b-256 |
bf66b6fa497c29ca36b4c27351bc53a7de53963deeab827d6f1d58a52ce77ef6
|
File details
Details for the file easyorm_py-1.0.21-cp313-cp313-manylinux2014_x86_64.whl.
File metadata
- Download URL: easyorm_py-1.0.21-cp313-cp313-manylinux2014_x86_64.whl
- Upload date:
- Size: 3.2 MB
- Tags: CPython 3.13
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a1dc40f38687a01023d94eeaabecf1e3551395e58662095f46151010f8e0270b
|
|
| MD5 |
302bf7499bc86b9ce1ea0bfda46e0be7
|
|
| BLAKE2b-256 |
90f7767cbe3c2a0760a3ef100ba4a831b61b28052e797b974b75bab031aeaa28
|
File details
Details for the file easyorm_py-1.0.21-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: easyorm_py-1.0.21-cp312-cp312-win_amd64.whl
- Upload date:
- Size: 466.9 kB
- Tags: CPython 3.12, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9ec104a197de7d3e05c2b64bff833d69aaece55ae36114803e3cc85eddd28c45
|
|
| MD5 |
201e6dea6dd58a861b7f7f09b239442d
|
|
| BLAKE2b-256 |
76fd12bb87216975cc4257aa90c1cba8d53089788f97f0e1f68fc581f9104791
|
File details
Details for the file easyorm_py-1.0.21-cp312-cp312-manylinux2014_x86_64.whl.
File metadata
- Download URL: easyorm_py-1.0.21-cp312-cp312-manylinux2014_x86_64.whl
- Upload date:
- Size: 3.2 MB
- Tags: CPython 3.12
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
edc8b56dfb8d4150bbeabbf390233331a6352e40af6065fcb11e04019deef7b7
|
|
| MD5 |
282f6e1ab11f564b6e2e7e80394edd0c
|
|
| BLAKE2b-256 |
e9fb4299f94cc0239d3e8be58ebbb3086574999f93c8540e8c6563f307c02ed3
|
File details
Details for the file easyorm_py-1.0.21-cp311-cp311-win_amd64.whl.
File metadata
- Download URL: easyorm_py-1.0.21-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 476.5 kB
- Tags: CPython 3.11, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5fcf8871fc9c2497e7ec6bcfd719f36cbae96b197a646ea506e09174b7a8365c
|
|
| MD5 |
e2af9048cc93c27dde230d0451480f8b
|
|
| BLAKE2b-256 |
1ab0c7712bebd0aa4283034183114fe1c8afb0c3e62902773a9b05c54694adf6
|
File details
Details for the file easyorm_py-1.0.21-cp311-cp311-manylinux2014_x86_64.whl.
File metadata
- Download URL: easyorm_py-1.0.21-cp311-cp311-manylinux2014_x86_64.whl
- Upload date:
- Size: 3.2 MB
- Tags: CPython 3.11
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
14993ae220a3ab838a999f2d345716cf1289be08682ab8657c981a4b6d93e898
|
|
| MD5 |
3e1d915b373acaa6bb0ccc5005e276d7
|
|
| BLAKE2b-256 |
fbeb53a7dc89ca1551dd05b26006b7782579bccff25d5031162694f63d3e8e52
|