saiorm是一款简单易用的数据库工具,主要功能是把 python 代码转译成数据库支持的原生语句,支持链式调用.
无需定义 model,没有太多性能损耗,学习成本极低.
0.2.0版本及之后支持python3.6+.
支持 MySQL / PostgreSQL / SQL Server / SQLite,分别使用 pymysql / pymssql / psycopg2 等来支持不同类型的数据库.
具体用法情况 test/test_MySQL.py
方法
insert, select, update, delete, execute, executemany, increase, decrease 方法应在链式调用的最后执行,对数据库的操作会立即生效.
last_sql 方法可返回最后执行的语句
get_fields_name 方法可获取所有字段名
where 方法可接受字典或字符串类型, IN 支持字符串或字符串组成的元组或列表.
select 和 get 方法只返回数据
update , delete , execute 等方法返回字典,包括:lastrowid, rowcount, rownumber, sql.
各种 join 请使用字符串参数,配合使用的 where 也用字符串参数.
注意
saiorm 不会转换 WHERE 中原生函数的参数和IN的参数,以及其他条件里的参数,如果条件需要使用用户传递进来的参数,请务必检查,以避免注入漏洞.
可以通过继承 saiorm.base.BaseDB 实现使用相同的 API 支持其他类型的数据库,可以参考siaorm.PostgreSQL.ChainDB.
如果要使用原生函数,请在参数前添加前缀 `,如果需要向原生函数传参,请使用元组或列表,使用 ? 作为参数的占位符,实际参数在后面传递,或者直接拼接字符串.
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