项目作者: get-net

项目描述 :
Data Mapper
高级语言: Lua
项目地址: git://github.com/get-net/data-mapper.git
创建时间: 2019-03-06T10:58:23Z
项目社区:https://github.com/get-net/data-mapper

开源协议:BSD 3-Clause "New" or "Revised" License

下载


data-mapper

Data mapper for lua

Contents

API

Usage

Dependencies

API

Entity

Entity - use for description table in database. For example

  1. local db = require("data-mapper.db"):new{
  2. config = {
  3. driver = "postgres",
  4. host = "localhost",
  5. port = "5432",
  6. user = "test",
  7. password = "testpw",
  8. database = "test",
  9. -- optional parameter for tarantool-db driver only. default value is 1
  10. size = 2
  11. }
  12. }
  13. local entity = require('data-mapper.entity')
  14. local testtype = entity:new{
  15. table = 'testtype',
  16. pk = 'sid',
  17. db = db,
  18. fields = {
  19. sid = {
  20. type = 'string'
  21. },
  22. name = {
  23. type = 'string'
  24. }
  25. }
  26. }
  27. local test = entity:new{
  28. table = 'test',
  29. pk = 'id',
  30. db = db,
  31. fields = {
  32. id = {
  33. type = 'number'
  34. },
  35. sid_testtype = {
  36. alias ='testtype',
  37. type = 'string',
  38. foreign_key = true,
  39. table = testtype
  40. },
  41. name = {
  42. type = 'string'
  43. },
  44. dt = {
  45. type = 'string'
  46. },
  47. balance = {
  48. type = 'number'
  49. }
  50. }
  51. }

In entity you can define properties:

  • schema - table schema. If not defined used public
  • table - table name
  • pk - table primary key. If not defined used id
  • prefix - used table prefix. If not defined used first char from schema and table for example
    public.test get prefix pt
  • db - used database
  • fields - defined fields in table

Entity provide those methods:

  • add - insert new record in table and return create record
  • update - update record in table
  • delete - delete record in table
  • get_by_pk - get records from table by primary key value
  • get_by_field - get records from table by field value
  • get - get records from table by fields parameters

add

For add new record:

  1. test = test:add({id=1,testtype = 'test1', name='test', dt='1970-01-01'})
  2. print(inspect(test))
  3. {
  4. dt = "1970-01-01",
  5. id = 1,
  6. name = "test",
  7. testtype = "test1"
  8. }

update

For update record:

  1. test = test:update({dt='2018-01-01', name='update-test'}, {id=1})
  2. print(inspect(test))
  3. {
  4. dt = "2018-01-01",
  5. id = 1,
  6. name = "update-test",
  7. testtype = "test1"
  8. }

delete

For delete record:

  1. test:delete{id=1}

get_by_pk

  1. test = test:get_by_pk(1)
  2. print(inspect(test))
  3. {
  4. dt = "2018-01-01",
  5. id = 1,
  6. name = "update-test",
  7. testtype = "test1"
  8. }

get_by_field

  1. test = test:get_by_field('name', 'update-test')
  2. print(inspect(test))
  3. {
  4. dt = "2018-01-01",
  5. id = 1,
  6. name = "update-test",
  7. testtype = "test1"
  8. }

get

Simple usage:

  1. test = test:get{ id=1, name= "update-test"}
  2. print(inspect(test))
  3. {
  4. dt = "2018-01-01",
  5. id = 1,
  6. name = "update-test",
  7. testtype = "test1"
  8. }

Advanced usage:

  1. test = test:get{ name = {value = "update", op = 'ilike' }}
  2. print(inspect(test))
  3. {
  4. dt = "2018-01-01",
  5. id = 1,
  6. name = "update-test",
  7. testtype = "test1"
  8. }

Now supported operation:

  • ilike
  • =,<,>,<=,>=

This operation also supported in update filter

Field

Definition fields in entity constructor generate Field object
Field object support

  • foreign keys
  • alias
  • prefetch (use LEFT JOIN)

Field object type can be:

  • string
  • number
  • boolean
  • json (you need json module for support it)

For example add link one to many

  1. uid_role = {
  2. type = "string",
  3. alias = "role",
  4. table = role,
  5. foreign_key = true
  6. fetch = true
  7. }

Condition

Use condition for complex query in where. Now supported and, or

_and

For example:

  1. local sql = user:select():join(orders):where(
  2. cond:_and(
  3. { user, name="test" },
  4. { orders, status = true }
  5. ))

_or

For example

  1. local sql = user:select():join(orders):where(
  2. cond:_and(
  3. { user, name="test" },
  4. cond:_or(
  5. { user, status = true },
  6. { user, expires_in = -1 }),
  7. { orders, status = true }
  8. ))

You can combine _or and _and where relation method. Also field in cond support operators
IN, <=, >=, IS.
For example

  1. cond:_and({user, name = {op='IN', value = {"test", "test2"} } })

Limit

To limit the number of rows returned by the query you can use complex query with limit() function
For example:

  1. local sql = token:user():limit(1)

Order

To order rows returned by the query you can use complex query with order() function
avaliable order types ASC (default) | DESC
For example:

  1. local sql = token:user():orderby({field = "name", ordertype = "DESC"})

Or more:

  1. user:select():join(orders):where(
  2. cond:_and(
  3. { user, name="test" },
  4. { orders, status = true }
  5. )):orderby(
  6. { user, field = "name", ordertype = "ASC" },
  7. { orders, field = "status", ordertype = "DESC" }
  8. )