You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
3.6 KiB
133 lines
3.6 KiB
package mysql
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"gorm.io/driver/mysql"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
func newSys(options Options) (sys *MySql, err error) {
|
|
sys = &MySql{options: options}
|
|
err = sys.init()
|
|
return
|
|
}
|
|
|
|
type MySql struct {
|
|
options Options
|
|
db *gorm.DB
|
|
}
|
|
|
|
func (this *MySql) init() (err error) {
|
|
this.db, err = gorm.Open(mysql.Open(this.options.MySQLDsn), &gorm.Config{})
|
|
if err != nil {
|
|
this.options.Log.Errorln(err)
|
|
}
|
|
return
|
|
}
|
|
|
|
// AutoIncrementStart 设置表自增主键的起始值(MySQL: ALTER TABLE ... AUTO_INCREMENT)。
|
|
// column 仅为跨驱动接口对齐保留,MySQL 用表级设置无需列名。
|
|
func (this *MySql) AutoIncrementStart(tName, column string, start uint64) (err error) {
|
|
_ = column
|
|
err = this.db.Exec(fmt.Sprintf("ALTER TABLE %s AUTO_INCREMENT = %d", tName, start)).Error
|
|
return
|
|
}
|
|
|
|
// AutoIncrementFloor 抬高自增主键下限:新插入的行 id >= start,已有行不动。
|
|
// MySQL 的 ALTER TABLE ... AUTO_INCREMENT 本身就是下限语义(低于当前最大值+1 时被静默忽略),
|
|
// 所以与 AutoIncrementStart 同一条语句;两个方法并存只为与 postgres 驱动的接口对齐。
|
|
func (this *MySql) AutoIncrementFloor(tName, column string, start uint64) (err error) {
|
|
return this.AutoIncrementStart(tName, column, start)
|
|
}
|
|
|
|
func (this *MySql) Exec(sql string, values ...interface{}) (tx *gorm.DB) {
|
|
tx = this.db.Exec(sql, values...)
|
|
return
|
|
}
|
|
|
|
func (this *MySql) Raw(sql string, values ...interface{}) (tx *gorm.DB) {
|
|
tx = this.db.Raw(sql, values...)
|
|
return
|
|
}
|
|
|
|
func (this *MySql) CreateTable(tName string, model any) (err error) {
|
|
err = this.db.Table(tName).AutoMigrate(model)
|
|
return
|
|
}
|
|
|
|
// 获取表对象
|
|
func (this *MySql) Table(tName string) (tx *gorm.DB) {
|
|
tx = this.db.Table(tName)
|
|
return
|
|
}
|
|
|
|
// 查询数据
|
|
func (this *MySql) FindOne(tName string, model any, query interface{}, args ...interface{}) (err error) {
|
|
result := this.db.Table(tName).Where(query, args...).First(model)
|
|
if result.Error != nil {
|
|
err = result.Error
|
|
}
|
|
return
|
|
}
|
|
|
|
// FindOnePrimary MySQL 未做读写分离,等同 FindOne(仅为与 postgres 驱动接口对齐)。
|
|
func (this *MySql) FindOnePrimary(tName string, model any, query interface{}, args ...interface{}) (err error) {
|
|
return this.FindOne(tName, model, query, args...)
|
|
}
|
|
|
|
// 查询数据
|
|
func (this *MySql) Find(tName string, models any, query interface{}, args ...interface{}) (err error) {
|
|
result := this.db.Table(tName).Where(query, args...).Find(models)
|
|
if result.Error != nil {
|
|
err = result.Error
|
|
}
|
|
return
|
|
}
|
|
|
|
// 插入数据
|
|
func (this *MySql) Insert(tName string, model any) (err error) {
|
|
result := this.db.Table(tName).Create(model)
|
|
if result.Error != nil {
|
|
err = result.Error
|
|
}
|
|
return
|
|
}
|
|
|
|
// 插入数据
|
|
func (this *MySql) Update(tName string, where, change map[string]interface{}) (err error) {
|
|
// 使用 Update 方法更新特定字段
|
|
result := this.db.Table(tName).Where(where).Updates(change)
|
|
if result.Error != nil {
|
|
err = result.Error
|
|
}
|
|
return
|
|
}
|
|
|
|
func (this *MySql) Save(tName string, model any) (err error) {
|
|
err = this.db.Table(tName).Save(model).Error
|
|
return
|
|
}
|
|
|
|
// 插入数据
|
|
func (this *MySql) Delete(tName string, query interface{}, args ...interface{}) (err error) {
|
|
// 使用 Update 方法更新特定字段
|
|
result := this.db.Table(tName).Where(query, args...).Unscoped().Delete(nil)
|
|
if result.Error != nil {
|
|
err = result.Error
|
|
}
|
|
return
|
|
}
|
|
|
|
// 删除表
|
|
func (this *MySql) DropTable(tName string) (err error) {
|
|
// 使用 Update 方法更新特定字段
|
|
err = this.db.Migrator().DropTable(tName)
|
|
return
|
|
}
|
|
|
|
// 事务
|
|
func (this *MySql) Begin() (tx *gorm.DB) {
|
|
tx = this.db.Begin()
|
|
return
|
|
}
|
|
|