npm i query-unit-orm
cnpm i query-unit-orm
选择一个目录用来存放两个基础配置文件,目录结构如下
- dataBase //目录名随意
- index.js
- config.yml
加载数据库对象
const { queryUnitORM } = require('query-unit-orm');
let db = new queryUnitORM(__dirname);
//创建一个数据库连接对象
//设置__dirname 之后,可以自动读取同目录下的配置文件 config.yml,或者可以自行设置目录位置
db.beginBuild();
//初始化数据库对象并连接
module.exports = db;
//导处该对象并在您想用的地方使用它
配置数据库及实体映射
# 数据库配置
DATABASE:
# 指定数据库,目前支持 mongodb、mysql
name: mongodb
# 连接地址
url: mongodb://localhost:27017/my_database
# 对于 mysql
# host: 127.0.0.1
# port: 3306
# database: ry
# 认证信息
authorization:
user: greatiga
pass: 123456
# 实体映射
ENTITYMAP:
# 表名或者集合名
user:
# 集合 user,存储用户信息的集合
# 设置字段及其对应的类型,以数组的形式
String: [ user_name, user_pwd, user_email ]
Number: [ user_phone ]
Array: [ user_friend ]
ObjectId: [ _id ]
简单实例
const { queryUnitORM } = require('query-unit-orm');
//读取目录下的 config.yml 配置文件
let db = new queryUnitORM(__dirname);
//开始构建连接
db.beginBuild().then(
res => Select(),
err => console.log(err)
)
//查询 user 集合中指定结果字段的两条数据
async function Select() {
let user = new db.Query("user");
user.set_ResultField(["user_name", "user_pwd", "user_email", "user_phone", "user_friend"]);
user.set_Limit(2)
let result = await db.Find(user);
console.log(result);
}
// [
// {
// user_name: 'tom',
// user_pwd: 123,
// user_email: '123@qq.com',
// user_phone: 111111,
// user_friend: [
// 'jack', 'bob'
// ]
// },
// {
// user_name: 'jack',
// user_pwd: 12344,
// user_email: '12344@qq.com',
// user_phone: 77777,
// user_friend: [
// 'bob', 'tom'
// ]
// }
// ]
无需在程序中编写 Schema 集合映射。可直接在 config.yml 中写入集合配置,会自动帮您生成对应的 Model 以供使用
-
假定有两个集合,可以如下配置
-
user
_id | user_name | user_pwd | user_email | user_phone | user_age | user_friend |
---|---|---|---|---|---|---|
1 | greatiga | 123456 | greatiga@126.com | 10086 | 21 | ['bob', 'tom'] |
2 | tom | 123 | tom@126.com | 1008611 | 22 | ['bob', 'tom'] |
- food
id | food_price | food_id | food_intro | food_classify | food_name |
---|---|---|---|---|---|
1 | $6 | 2020 | 美味 | 水果 | 21 |
DATABASE:
name: mongodb
url: mongodb://localhost:27017/my_database
authorization:
user: greatiga
pass: 123456
ENTITYMAP:
user:
String: [ user_name, user_pwd, user_email ]
Number: [ user_phone ]
ObjectId: [ _id ]
Array: [ user_friend ]
food:
String: [food_intro, food_classify, food_name]
Number: [id, food_price, food_id]
假定有表 sys_food 和 sys_student ;与上面同理,相同的设置方式
DATABASE:
name: mysql
host: localhost
port: 3306
dataBase: test
authorization:
user: greatiga
pass: 123456
ENTITYMAP:
sys_food:
String: [food_intro, food_classify, food_name]
Number: [id, food_price, food_id]
sys_student:
String: [student_name, student_hobby, student_sex, student_birthday]
Number: [student_id, student_age]
构造函数,用于创建一个数据库对象
const { queryUnitORM } = require('query-unit-orm');
let db = new queryUnitORM();
设置配置文件路径,在需要动态改变时在使用它,否则建议 beginBuild() 时用 __dirname 作为参数传入,让程序帮你读取
db.setPath('../../dataBase/config.yml');
设置配置文件原始内容,即全为字符串的原始文件内容,这里不建议使用这种方式传入配置文件
let configFile = "...(原始字符串内容)"
db.setConfigFile(configFile);
设置可以解析的配置对象。本步骤旨在不使用 config.yml 的前提下,自行设置可执行的 JavaScript对象
let config = {
DATABASE: {
name: "mongodb",
url: "mongodb://localhost:27017/great_blog",
type_check: true,
authorization: {
user: "greatiga",
pass: 123
}
},
ENTITYMAP: {
user: {
String: ["user_name", "user_pwd", "user_email"],
Number: ["user_phone"]
}
}
}
db.setDataBaseConfig(config);
设置完配置文件或配置对象后, 开始构建连接,程序会帮您连接数据库并初始化
- 方式一
const { queryUnitORM } = require('query-unit-orm');
let db = new queryUnitORM();
db.setPath("../../dataBase/config.yml");
db.beginBuild();
- 方式二
const { queryUnitORM } = require('query-unit-orm');
let config = {
DATABASE: {
name: "mongodb",
url: "mongodb://localhost:27017/great_blog",
type_check: true,
authorization: {
user: "greatiga",
pass: 123
}
},
ENTITYMAP: {
user: {
String: ["user_name", "user_pwd", "user_email"],
Number: ["user_phone"]
}
}
}
let db = new queryUnitORM();
db.setDataBaseConfig(config)//setDataBaseConfig 的方式配置对象
db.beginBuild();
- 方式三(推荐方式)
将配置文件 config.yml 放在当前目录下。 __dirname值为当前目录路径,全局变量直接使用,不需要定义;当然也可以自己传入指定的路径作为参数,若采用第二种情况则与方式一没什么区别。
const { queryUnitORM } = require('query-unit-orm');
let db = new queryUnitORM(__dirname);
//Or
//let db = new Simply_DataBase("../../dataBase/config.yml");
db.beginBuild();
数据库连接和其他查询配置
DATABASE:
name: mongodb
url: mongodb://localhost:27017/my_database
# Or
# host: localhost
# port: 27017
# database: my_database
authorization:
user: greatiga
pass: 123456
####################
####################
DATABASE:
name: mysql
host: 127.0.0.1
port: 3306
database: my_database
authorization:
user: greatiga
pass: 123456
-
name
- 数据库名
- mongodb | mysql
-
url
- mongodb 连接地址
- mongodb 特有方式,mysql 必须严格指定 ip,端口
- mongodb://XXX(host):(XXX)port/XXX(dataBase Name)
-
host
- IP: mongodb 和 mysql 都可以这样指定
- 例如 127.0.0.1
-
port
- 端口: mongodb 和 mysql 都可以这样指定
- 例如 3306
-
dataBase
- 数据库名: mongodb 和 mysql 都可以这样指定
- 例如 my_database
-
authorization
- 认证信息
- user
- 用户名
- password
- 密码
-
type_check
- 是否开启查询语句检查,开启后将会检查-查询语句字段是否存在,以及字段类型是否正确。但是这会损耗查询效率
- true | false
mongodb 可以使用 url 的方式设置连接信息,也可以通过分别设置 host,port等指定。两种方式同时存在时程序以 url 为准
mysql 只能通过设置 host,port等来指定连接信息
配置数据库中的表或集合,以及对应字段的类型。type_check 开启后,会根据该配置信息进行检查
ENTITYMAP:
user:
String: [ user_name, user_pwd, user_email ]
Number: [ user_phone ]
ObjectId: [ _id ]
Array: [ user_friend ]
food:
String: [food_intro, food_classify, food_name]
Number: [id, food_price, food_id]
- 一级缩进为 ENTITYMAP
- 二级缩进为表名
- 三级缩进为类型,代表后面数组中的字段都是该类型
simply-orm 与其他 ORM 框架一样,主张将原生的 sql 语句与实体对象做映射。
首先,每一个不可继续细分的查询语句,都应该包括(属性)和(动作)
-
属性
- 表名或集合名: 即所要查询的集合或者表格--必须
- 结果字段: 即查询结果后应展示哪一些表中字段--必须
- insert数据: 插入时提供的数据--可选
- 修改字段: 当需要修改时指定修改数据--当修改操作时必须
- 查询条件: 包括(AND, OR, LIKE)--可选
- 结果排序: orderBy--可选
- 数量限制: limit--可选
-
动作
- find: 根据 查询条件 + 结果排序(可选) + 数量限制(可选) 查找
- update: 根据 查询条件 + 修改字段 修改
- remove: 根据 查询条件 + 数量限制(可选) 删除
- save: 根据 insert数据 存储
在此基础上,扩展至级联查询(目前还没有做......)
simply-orm 将这样的一个不可继续细分的查询语句称为查询元。对该查询元进行属性约束后,用不同的动作即可对它进行 curd
参考 mongoose 的写法
$gt: >
$lt: <
$gte: >=
$lte: <=
$ne: !=
以下为属性部分的操作,由 new db.Query("XX") 产生的对象所拥有
- 接受一个参数,值为表格名或者集合名
DATABASE:
name: mysql
...
...
ENTITYMAP:
user:
String: [ user_name, user_pwd, user_email ]
Number: [ user_phone, user_age, user_class ]
ObjectId: [ _id ]
Array: [ user_friend ]
const { queryUnitORM } = require('query-unit-orm');
let db = new queryUnitORM(__dirname);
db.beginBuild().then(() => Test());
async function Test() {
let user = new db.Query("user");
}
上述代码创建了一个新的 user(表格/集合) 查询元
结果字段,采用数组的形式指定结果应该包含哪些字段
- 接受一个数组作为参数
SQL--SELECT user_name, user_phone, user_email FROM user;
const { queryUnitORM } = require('query-unit-orm');
let db = new queryUnitORM(__dirname);
db.beginBuild().then(() => Test());
async function Test() {
let user = new db.Query("user");
user.result_Field(["user_name", "user_phone", "user_email"]);
let result = await db.Find(user);
console.log(result);
}
// [
// {
// user_name: 'tom',
// user_email: '123@qq.com',
// user_phone: 111111,
// },
// {
// user_name: 'bob',
// user_email: '12344@qq.com',
// user_phone: 77777,
// }
// ]
除指定字段外的所有字段,即: 删除指定的字段,其余都展示
- 接受一个数组作为参数
SQL--SELECT _id, user_name, user_pwd, user_friend FROM user;
let user = new db.Query("user");
user.unResult_Field(["user_phone", "user_email"]);
let result = await db.Find(user);
console.log(result);
// [
// {
// _id_: 1,
// user_name: 'tom',
// user_pwd: 123,
// user_friend: ['bob'],
// user_age: 18,
// user_class: 101
// },
// {
// _id_: 2,
// user_name: 'bob',
// user_pwd: 456,
// user_friend: ['tom'],
// user_age: 19,
// user_class: 101
// },
// {
// _id_: 3,
// user_name: 'hello',
// user_pwd: xc123,
// user_friend: ['bob'],
// user_age: 20,
// user_class: 102
// },
// ]
指定修改字段
- 接受一个对象作为参数
SQL--UPDATE user SET user_pwd = 789 WHERE user_name = "tom";
let user = new db.Query("user");
user.update_Field({ user_pwd: 789 });
user.and({ user_name: 'tom' });
db.Update(user).then(
//....
)
- 接受一个对象作为参数
SQL--SELECT user_name, user_pwd, user_phone FROM user WHERE user_class = 101 AND user_age > 18;
let user = new db.Query("user");
user.result_Field(["_id", "user_name", "user_pwd", "user_friend", "user_age", "user_class"]);
user.and({
user_age: { $gt: 18 },
user_class: 101
});
let result = await db.Find(user);
consoel.log(result)
//[
// {
// _id_: 2,
// user_name: 'bob',
// user_pwd: 456,
// user_friend: ['tom'],
// user_age: 19,
// user_class: 101
// },
//]
- 接受一个对象作为参数
SQL--SELECT user_name, user_pwd, user_phone FROM user WHERE user_class = 101 OR user_age > 18;
let user = new db.Query("user");
user.result_Field(["_id", "user_name", "user_pwd", "user_friend", "user_age", "user_class"]);
user.or({
user_age: { $gt: 18 },
user_class: 101
});
let result = await db.Find(user);
consoel.log(result)
//[
// {
// _id_: 1,
// user_name: 'tom',
// user_pwd: 123,
// user_friend: ['bob'],
// user_age: 18,
// user_class: 101
// },
// {
// _id_: 2,
// user_name: 'bob',
// user_pwd: 456,
// user_friend: ['tom'],
// user_age: 19,
// user_class: 101
// },
//]
模糊匹配
- 接受两个参数
- 参数一为对象
- 参数二为多个模糊查询时并列与否。可选值 and | or,默认为 or
SQL--SELECT user_name, user_pwd, user_phone FROM user WHERE user_name LIKE "he%" AND user_email LIKE "@%";
let user = new db.Query("user");
user.result_Field(["_id", "user_name", "user_pwd", "user_friend", "user_age", "user_email"]);
user.like({ user_name: "he%", user_email: "@%" }, "and");
let result = await db.Find(user);
consoel.log(result)
//[
// {
// _id_: 3,
// user_name: 'hello',
// user_pwd: xc123,
// user_friend: ['bob'],
// user_age: 20,
// user_email: "123@qq.com"
// },
//]
以下为数据库对象 db(名字取决于你的定义,不代表必须是这个名字) 所拥有,即 new simplyORM() 所创对象
对传入的查询元执行查找。
- 异步操作,可使用 await 或 then()
let user = new db.Query("user");
//...
db.Find(user);
对传入的查询元执行修改。
- 异步操作,可使用 await 或 then()
let user = new db.Query("user");
//...
db.Update(user);
对传入的查询元执行删除。
- 异步操作,可使用 await 或 then()
let user = new db.Query("user");
//...
db.Remove(user);
对传入的查询元执行存储。
- 异步操作,可使用 await 或 then()
let user = new db.Query("user");
//...
db.Save(user);
设定如下表格或者集合
DATABASE:
name: mongodb
url: mongodb://localhost:27017/my_database
authorization:
user: greatiga
pass: 123456
ENTITYMAP:
user:
String: [ user_name, user_pwd, user_email, user_intro ]
Number: [ user_phone, user_class ]
ObjectId: [ _id ]
Array: [ user_friend ]
food:
String: [food_intro, food_classify, food_name]
Number: [id, food_price, food_id]
个人介绍"加油"结尾,或者邮箱包含有"tom",并且年龄大于18的人。只展示名字,邮箱,年龄,个人介绍
**SQL--SELECT user_name, user_age, user_intro FROM user WHERE (user_intro LIKE "%你好" OR user_email LIKE "%tom%") AND user_age > 18;
const { queryUnitORM } = require('query-unit-orm');
let db = new queryUnitORM(__dirname);
db.beginBuild().then(() => Test());
async function Test() {
let user = new db.Query("user");
user.result_Field(["user_name", "user_age", "user_intro"]);
user.like({
user_intro: "%加油",
user_email: "%tom%"
});
user.and({ user_age: { $gt: 18} });
let result = await db.Find(user);
console.log(result);
}
// [
// {
// user_name: 'tom',
// user_intro: '我是tom,大家好',
// user_email: "mytom@123.com"
// user_age: 19,
// },
// {
// user_name: 'bob',
// user_intro: '我是bob,大家一起加油',
// user_email: "mybob@123.com"
// user_age: 20,
// }
// ]