model guide
Introduction
jzero supports generating database code to internal/model through sql ddl files under desc/sql folder and remote datasources.
For easier usage, jzero automatically generates internal/model/model.go file to register all generated database code.
Currently supports two database types: mysql and postgres, where:
- mysql: Supports both sql files and remote datasource code generation
- postgres: Only supports remote datasource code generation
Features
- Supports multi-datasource code generation
- Supports redis/custom cache
- Dynamically adapts to multiple database types (mysql/postgres/sqlite), just modify configuration file to specify database driver, can switch between different databases without modifying any code
Generate code based on local sql ddl files
desc/sql
├── manage_email.sql
├── manage_menu.sql
├── manage_role.sql
├── manage_role_menu.sql
└── manage_user.sql
└── manage_user_role.sqlgen:
# mysql or postgres, default is mysql
model-driver: mysql
# whether to generate database code with cache
model-cache: true
# cache tables, default is *(all)
model-cache-table:
- manage_user
# schema
model-schema: jzero-admin
# Ignore columns while creating or updating rows, default is create_at,created_at,create_time,update_at,updated_at,update_time
model-ignore-columns: ["create_time", "update_time"]jzero genGenerated internal/model/model.go as follows:
// Code generated by jzero. DO NOT EDIT.
package model
import (
"github.com/eddieowens/opts"
"github.com/jzero-io/jzero-admin/server/internal/model/manage_email"
"github.com/jzero-io/jzero-admin/server/internal/model/manage_menu"
"github.com/jzero-io/jzero-admin/server/internal/model/manage_role"
"github.com/jzero-io/jzero-admin/server/internal/model/manage_role_menu"
"github.com/jzero-io/jzero-admin/server/internal/model/manage_user"
"github.com/jzero-io/jzero-admin/server/internal/model/manage_user_role"
"github.com/jzero-io/jzero/core/stores/modelx"
"github.com/zeromicro/go-zero/core/stores/sqlx"
)
type Model struct {
ManageEmail manage_email.ManageEmailModel
ManageMenu manage_menu.ManageMenuModel
ManageRole manage_role.ManageRoleModel
ManageRoleMenu manage_role_menu.ManageRoleMenuModel
ManageUser manage_user.ManageUserModel
ManageUserRole manage_user_role.ManageUserRoleModel
}
func NewModel(conn sqlx.SqlConn, op ...opts.Opt[modelx.ModelOpts]) Model {
return Model{
ManageEmail: manage_email.NewManageEmailModel(conn, op...),
ManageMenu: manage_menu.NewManageMenuModel(conn, op...),
ManageRole: manage_role.NewManageRoleModel(conn, op...),
ManageRoleMenu: manage_role_menu.NewManageRoleMenuModel(conn, op...),
ManageUser: manage_user.NewManageUserModel(conn, op...),
ManageUserRole: manage_user_role.NewManageUserRoleModel(conn, op...),
}
}jzero supports multi-datasource, just specify schema in sql file
For example, add jzeroadmin_log.operate_log.sql table
desc/sql
├── manage_email.sql
├── manage_menu.sql
├── manage_role.sql
├── manage_role_menu.sql
└── manage_user.sql
└── manage_user_role.sql
└── jzero-admin_log.operate_log.sqljzero genGenerated internal/model/model.go as follows:
// Code generated by jzero. DO NOT EDIT.
package model
import (
"github.com/eddieowens/opts"
"github.com/jzero-io/jzero/core/stores/modelx"
"github.com/zeromicro/go-zero/core/stores/sqlx"
"github.com/jzero-io/jzero-admin/server/internal/model/jzero-admin_log/operate_log"
"github.com/jzero-io/jzero-admin/server/internal/model/manage_email"
"github.com/jzero-io/jzero-admin/server/internal/model/manage_menu"
"github.com/jzero-io/jzero-admin/server/internal/model/manage_role"
"github.com/jzero-io/jzero-admin/server/internal/model/manage_role_menu"
"github.com/jzero-io/jzero-admin/server/internal/model/manage_user"
"github.com/jzero-io/jzero-admin/server/internal/model/manage_user_role"
)
type JzeroAdminLogModel struct {
OperateLog operate_log.OperateLogModel
}
type Model struct {
ManageEmail manage_email.ManageEmailModel
ManageMenu manage_menu.ManageMenuModel
ManageRole manage_role.ManageRoleModel
ManageRoleMenu manage_role_menu.ManageRoleMenuModel
ManageUser manage_user.ManageUserModel
ManageUserRole manage_user_role.ManageUserRoleModel
}
func NewModel(conn sqlx.SqlConn, op ...opts.Opt[modelx.ModelOpts]) Model {
return Model{
ManageEmail: manage_email.NewManageEmailModel(conn, op...),
ManageMenu: manage_menu.NewManageMenuModel(conn, op...),
ManageRole: manage_role.NewManageRoleModel(conn, op...),
ManageRoleMenu: manage_role_menu.NewManageRoleMenuModel(conn, op...),
ManageUser: manage_user.NewManageUserModel(conn, op...),
ManageUserRole: manage_user_role.NewManageUserRoleModel(conn, op...),
}
}
func NewJzeroAdminLogModel(conn sqlx.SqlConn, op ...opts.Opt[modelx.ModelOpts]) JzeroAdminLogModel {
return JzeroAdminLogModel{
OperateLog: operate_log.NewOperateLogModel(conn, op...),
}
}Generate code based on remote datasource
mysql
gen:
model-driver: mysql
# whether to generate database code with cache
model-cache: true
# cache tables, default is *(all)
model-cache-table:
- manage_user
# whether to use remote mysql datasource to generate code
model-datasource: true
# mysql datasource configuration
model-datasource-url: "root:123456@tcp(127.0.0.1:3306)/jzero-admin"
# Ignore columns while creating or updating rows, default is create_at,created_at,create_time,update_at,updated_at,update_time
model-ignore-columns: ["create_time", "update_time"]
# which tables to use, default is *(all)
model-datasource-table:
- manage_email
- manage_menu
- manage_role
- manage_role_menu
- manage_user
- manage_user_rolejzero genGenerated internal/model/model.go is consistent with based on local sql ddl files generation
jzero supports multi-datasource, just specify schema in model-datasource-table
For example, add jzero-admin_log.operate_log table
gen:
model-driver: mysql
# whether to generate database code with cache
model-cache: true
# cache tables, default is *(all)
model-cache-table:
- manage_user
# whether to use remote mysql datasource to generate code
model-datasource: true
# mysql datasource configuration
model-datasource-url:
- "root:123456@tcp(127.0.0.1:3306)/jzero-admin"
- "root:123456@tcp(127.0.0.1:3306)/jzero-admin_log"
# Ignore columns while creating or updating rows, default is create_at,created_at,create_time,update_at,updated_at,update_time
model-ignore-columns: ["create_time", "update_time"]
# which tables to use, default is *(all)
model-datasource-table:
- manage_email
- manage_menu
- manage_role
- manage_role_menu
- manage_user
- manage_user_role
- jzero-admin_log.operate_logjzero genGenerated internal/model/model.go is consistent with based on local sql ddl files generation
postgres
gen:
model-driver: pgx
# whether to generate database code with cache
model-cache: true
# cache tables, default is *(all)
model-cache-table:
- manage_user
# whether to use remote postgres datasource to generate code
model-datasource: true
# postgres datasource configuration
model-datasource-url: "postgres://root:123456@127.0.0.1:5432/jzero-admin"
# Ignore columns while creating or updating rows, default is create_at,created_at,create_time,update_at,updated_at,update_time
model-ignore-columns: ["create_time", "update_time"]
# which tables to use, default is *(all)
model-datasource-table:
- manage_email
- manage_menu
- manage_role
- manage_role_menu
- manage_user
- manage_user_rolejzero genGenerated internal/model/model.go is consistent with mysql driver
jzero supports multi-datasource, just specify schema in model-datasource-table
For example, add jzeroadmin_log.operate_log table
gen:
model-driver: postgres
# whether to generate database code with cache
model-cache: true
# cache tables, default is *(all)
model-cache-table:
- manage_user
# whether to use remote postgres datasource to generate code
model-datasource: true
# postgres datasource configuration
model-datasource-url:
- "postgres://root:123456@127.0.0.1:5432/jzero-admin"
- "postgres://root:123456@127.0.0.1:5432/jzero-admin_log"
# Ignore columns while creating or updating rows, default is create_at,created_at,create_time,update_at,updated_at,update_time
model-ignore-columns: ["create_time", "update_time"]
# which tables to use, default is *(all)
model-datasource-table:
- manage_email
- manage_menu
- manage_role
- manage_role_menu
- manage_user
- manage_user_role
- jzero-admin_log.operate_logjzero genGenerated internal/model/model.go is consistent with mysql driver
Default generated methods
- WithTable: Specify table name, used for table sharding scenarios
- Insert: Insert single row
- InsertV2: Insert single row (insert v2 version, can get auto-increment primary key)
- BulkInsert: Batch insert
- Update: Update single row by primary key
- Delete: Delete single row by primary key
- FindOne: Query single row by primary key
- FindByCondition: Conditional query
- FindFieldsByCondition: Conditional query (specify query fields)
- FindOneByCondition: Conditional single row query
- FindOneFieldsByCondition: Conditional single row query (specify query fields)
- CountByCondition: Conditional total count
- PageByCondition: Conditional pagination query
- UpdateFieldsByCondition: Conditional update specified fields
- DeleteByCondition: Conditional delete
For detailed usage, see: condition component