Saiorm Python 实现的数据库工具

程序名称:Saiorm

授权协议: MIT

操作系统: 跨平台

开发语言: Python

Saiorm 介绍

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. selectget 方法只返回数据

  6. update , delete , execute方法返回字典,包括: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

Saiorm 官网

https://github.com/weihaipy/saiorm

相关编程语言

SchemaCrawler提供一组用于增强标准JDBC Metadata的...
ER Master 是一个用于设计ER模型图的Eclipse插件。提...
Eclipse下用于画数据库ER图的插件,主要特性如下: ...
PowerDesigner 是Sybase的企业建模和设计解决方案,...
Mogwai ERDesigner NG是一个实体关系建模工具类似于...
Power*Architect 是一个数据建模工具,主要用在数据...