SaiormPython 实现的数据库工具

联合创作 · 2023-09-30 23:32

saiorm是一款简单易用的数据库工具,主要功能是把 python 代码转译成数据库支持的原生语句,支持链式调用.

无需定义 model,没有太多性能损耗,学习成本极低.

0.2.0版本及之后支持python3.6+.

支持 MySQL / PostgreSQL / SQL Server / SQLite,分别使用 pymysql / pymssql / psycopg2  等来支持不同类型的数据库.

具体用法情况 test/test_MySQL.py

方法

  1. insert, select, update, delete, execute, executemany, increase, decrease 方法应在链式调用的最后执行,对数据库的操作会立即生效.

  2. last_sql 方法可返回最后执行的语句

  3. get_fields_name 方法可获取所有字段名

  4. where 方法可接受字典或字符串类型,IN 支持字符串或字符串组成的元组或列表.

  5. select 和 get 方法只返回数据

  6. updatedeleteexecute 等方法返回字典,包括:lastrowid, rowcount, rownumber, sql.

  7. 各种 join 请使用字符串参数,配合使用的 where 也用字符串参数.

注意

  1. saiorm 不会转换 WHERE 中原生函数的参数和IN的参数,以及其他条件里的参数,如果条件需要使用用户传递进来的参数,请务必检查,以避免注入漏洞.

  2. 可以通过继承 saiorm.base.BaseDB 实现使用相同的 API 支持其他类型的数据库,可以参考siaorm.PostgreSQL.ChainDB.

  3. 如果要使用原生函数,请在参数前添加前缀 `,如果需要向原生函数传参,请使用元组或列表,使用 ? 作为参数的占位符,实际参数在后面传递,或者直接拼接字符串.

  4. SQL Server 依赖的 pymssql 不会返回执行的语句,如果需要,必须在调用 connect 方法时手动设置 return_sql=True ,让 saiorm用格式化查询语句的方式生成,以提高性能.需要在 调用 table 方法时传入 primary_key ,以实现对 LIMIT 的支持.

用法

初始化 MySQL:

import saiorm

DB = saiorm.init()  # 不使用表名前缀
# DB = saiorm.init(table_name_prefix="abc_") # 使用表名前缀
DB.connect({"host": "", "port": 3306, "database": "", "user": "", "password": ""})
table = DB.table("xxx") # 此处为了方便下面对于 xxx 表的操作,只执行了一次 table 方法

初始化 PostgreSQL:

import saiorm
DB = saiorm.init(driver="PostgreSQL")   # without table name prefix
# DB = saiorm.init(driver="PostgreSQL", table_name_prefix="abc_") # with table name prefix
DB.connect({"host": "", "port": "5432", "database": "", "user": "", "password": ""})
table = DB.table("xxx")

初始化 SQL Server:

import saiorm
DB = saiorm.init(driver="SQLServer")   # without table name prefix
# DB = saiorm.init(driver="SQLServer", table_name_prefix="abc_") # with table name prefix
DB.connect({"host": "", "port": "1433", "database": "", "user": "", "password": ""})
# DB.connect({"host": "", "port": "1433", "database": "", "user": "", "password": ""},return_sql=True)# can get latest sql you executed
table = DB.table("xxx", primary_key="id")  # For LIMIT implement with SQL Server

下面的用法中转换的 SQL 都是 MySQL 风格的,和 PostgreSQL 以及 SQL Server 可能有些不同,特别是 LIMIT.

查询:

# 所有字段
table.select("*")

# 排序并获取最后一行
table.order_by("id DESC").get()

# 各种类型的 where 条件
table.where({
    "a": 1,
    "b": ("BETWEEN", "1", "2"),
    "c": ("`ABS(?)", "2"),
    "d": ("!=", 0),
    "e": ("IN", "1,2,3"),
    "f": "`NOW()",
}).select("e,f")
SELECT * FROM xxx ;
SELECT * FROM xxx  ORDER BY id DESC LIMIT 1;
SELECT e,f FROM xxx WHERE a=1 AND b BETWEEN '1' AND '2' AND d!=0 AND e IN (1,2,3) ;

select 和 get 方法可限制字段名,默认返回所有字段.

更新:

table.where({
    "a": ("IN", ["1", "2", "3"]),
    "b": ("`ABS(?)", "2"),
}).update({
    "c": "`ABS(2)",
    "d": ("`ABS(?)", 3),
    "e": "2",
})
UPDATE xxx SET c=ABS(2),d=ABS(3),e='2' WHERE a IN (1,2,3) AND b=ABS(2) ;

插入:

# 自然字典
table.insert({
    "a": "1",
    "b": "2",
})

# 拆分字典
table.insert({
    "fields": ["a", "b"],
    "values": ["1", "2"],
})

# 插入多行,自然字典
table.insert_many([{
    "a": "1",
    "b": "2",
}, {
    "a": "3",
    "b": "4",
}, {
    "a": "5",
    "b": "6",
}])

# 插入多行,拆分字典
table.insert_many({
    "fields": ["a", "b"],
    "values": [
        ["1", "2"],
        ["3", "4"],
        ["5", "6"]
    ]
})
INSERT INTO xxx (a,b) VALUES ('1','2');
INSERT INTO xxx (a,b) VALUES ('1','2');
INSERT INTO xxx (a,b) VALUES ('1','2'),('3','4'),('5','6');
INSERT INTO xxx (a,b) VALUES ('1','2'),('3','4'),('5','6');

删除:

table.where({
    "a": "1",
    "b": "2",
    "c": ("`ABS(?)", "2"),
    "d": "`NOW()",
}).delete()

table.delete() # 没有 where 条件的默认不会执行
DELETE FROM xxx WHERE a=1 AND b=2 AND c=ABS(2) AND d=NOW() ;
DELETE FROM xxx ; -- 此条仅供演示,默认值不执行有 where 条件的

数字字段增加:

table.increase("a", 1)
UPDATE xxx SET a=a+1

数字字段减少:

table.decrease("a", 1)
UPDATE xxx SET a=a-1
浏览 8
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报