github.com/unionj-cloud/go-doudou/v2@v2.3.5/toolkit/dbvendor/mysql/mysql.go (about)

     1  package mysql
     2  
     3  import (
     4  	"context"
     5  	"database/sql"
     6  	"fmt"
     7  	"github.com/pkg/errors"
     8  	"github.com/unionj-cloud/go-doudou/v2/framework/database"
     9  	"github.com/unionj-cloud/go-doudou/v2/toolkit/dbvendor"
    10  	"gorm.io/gorm"
    11  )
    12  
    13  func init() {
    14  	dbvendor.Registry.Register(database.DriverMysql, &Vendor{})
    15  }
    16  
    17  var _ dbvendor.IVendor = (*Vendor)(nil)
    18  
    19  type Vendor struct {
    20  }
    21  
    22  func (v *Vendor) GetBatchInsertStatement(dml dbvendor.DMLSchema, rows []interface{}) (statement string, err error) {
    23  	//TODO implement me
    24  	panic("implement me")
    25  }
    26  
    27  func (v *Vendor) ToColumnType(goType string, _ bool) string {
    28  	switch goType {
    29  	case "int", "int16", "int32":
    30  		return IntType
    31  	case "int64":
    32  		return BigintType
    33  	case "float32":
    34  		return FloatType
    35  	case "float64":
    36  		return DoubleType
    37  	case "string":
    38  		return VarcharType
    39  	case "text":
    40  		return LongtextType
    41  	case "bool", "int8":
    42  		return TinyintType
    43  	case "time.Time":
    44  		return DatetimeType
    45  	case "decimal.Decimal":
    46  		return "decimal(6,2)"
    47  	case "types.JSONText":
    48  		return JSONType
    49  	}
    50  	panic(fmt.Sprintf("no available type %s", goType))
    51  }
    52  
    53  func (v *Vendor) CreateTable(ctx context.Context, db *gorm.DB, t dbvendor.Table) error {
    54  	var (
    55  		statement string
    56  		err       error
    57  	)
    58  	if statement, err = dbvendor.String(createTable, createTable, t, nil); err != nil {
    59  		return err
    60  	}
    61  	return db.WithContext(ctx).Exec(statement).Error
    62  }
    63  
    64  func (v *Vendor) DropTable(ctx context.Context, db *gorm.DB, t dbvendor.Table) error {
    65  	var (
    66  		statement string
    67  		err       error
    68  	)
    69  	if statement, err = dbvendor.String(dropTable, dropTable, t, nil); err != nil {
    70  		return err
    71  	}
    72  	return db.WithContext(ctx).Exec(statement).Error
    73  }
    74  
    75  func (v *Vendor) ChangeColumn(ctx context.Context, db *gorm.DB, col dbvendor.Column) error {
    76  	var (
    77  		statement string
    78  		err       error
    79  	)
    80  	if statement, err = dbvendor.StringBlock(alterTable, alterTable, "change", col, nil); err != nil {
    81  		return err
    82  	}
    83  	return db.WithContext(ctx).Exec(statement).Error
    84  }
    85  
    86  func (v *Vendor) AddColumn(ctx context.Context, db *gorm.DB, col dbvendor.Column) error {
    87  	var (
    88  		statement string
    89  		err       error
    90  	)
    91  	if statement, err = dbvendor.StringBlock(alterTable, alterTable, "add", col, nil); err != nil {
    92  		return err
    93  	}
    94  	return db.WithContext(ctx).Exec(statement).Error
    95  }
    96  
    97  func (v *Vendor) DropColumn(ctx context.Context, db *gorm.DB, col dbvendor.Column) error {
    98  	var (
    99  		statement string
   100  		err       error
   101  	)
   102  	if statement, err = dbvendor.StringBlock(alterTable, alterTable, "drop", col, nil); err != nil {
   103  		return err
   104  	}
   105  	return db.WithContext(ctx).Exec(statement).Error
   106  }
   107  
   108  func (v *Vendor) Insert(ctx context.Context, db *gorm.DB, dml dbvendor.DMLSchema, args ...interface{}) (int64, error) {
   109  	var (
   110  		statement string
   111  		err       error
   112  	)
   113  	if statement, err = v.GetInsertStatement(dml); err != nil {
   114  		return 0, errors.WithStack(err)
   115  	}
   116  	sqlDB, err := db.DB()
   117  	if err != nil {
   118  		return 0, errors.WithStack(err)
   119  	}
   120  	result, err := sqlDB.ExecContext(ctx, statement, args...)
   121  	if err != nil {
   122  		return 0, errors.WithStack(err)
   123  	}
   124  	id, err := result.LastInsertId()
   125  	if err != nil {
   126  		return 0, errors.WithStack(err)
   127  	}
   128  	return id, nil
   129  }
   130  
   131  func (v *Vendor) GetInsertStatement(dml dbvendor.DMLSchema) (statement string, err error) {
   132  	if statement, err = dbvendor.String(insertInto, insertInto, dml, dbvendor.Question); err != nil {
   133  		return "", errors.WithStack(err)
   134  	}
   135  	return statement, nil
   136  }
   137  
   138  func (v *Vendor) GetInsertReturningPkStatement(dml dbvendor.DMLSchema) (statement string, err error) {
   139  	if statement, err = dbvendor.String(insertInto, insertInto, dml, dbvendor.Question); err != nil {
   140  		return "", errors.WithStack(err)
   141  	}
   142  	return statement, nil
   143  }
   144  
   145  func (v *Vendor) GetUpdateStatement(dml dbvendor.DMLSchema) (statement string, err error) {
   146  	if statement, err = dbvendor.String(updateTable, updateTable, dml, dbvendor.Question); err != nil {
   147  		return "", errors.WithStack(err)
   148  	}
   149  	return statement, nil
   150  }
   151  
   152  func (v *Vendor) Update(ctx context.Context, db *gorm.DB, dml dbvendor.DMLSchema, args ...interface{}) error {
   153  	var (
   154  		statement string
   155  		err       error
   156  	)
   157  	if statement, err = v.GetUpdateStatement(dml); err != nil {
   158  		return errors.WithStack(err)
   159  	}
   160  	sqlDB, err := db.DB()
   161  	if err != nil {
   162  		return errors.WithStack(err)
   163  	}
   164  	_, err = sqlDB.ExecContext(ctx, statement, args...)
   165  	if err != nil {
   166  		return errors.WithStack(err)
   167  	}
   168  	return nil
   169  }
   170  
   171  func (v *Vendor) Delete(ctx context.Context, db *gorm.DB, dml dbvendor.DMLSchema, args ...interface{}) error {
   172  	var (
   173  		statement string
   174  		err       error
   175  	)
   176  	if statement, err = dbvendor.String(deleteFrom, deleteFrom, dml, dbvendor.Question); err != nil {
   177  		return errors.WithStack(err)
   178  	}
   179  	sqlDB, err := db.DB()
   180  	if err != nil {
   181  		return errors.WithStack(err)
   182  	}
   183  	_, err = sqlDB.ExecContext(ctx, statement, args...)
   184  	if err != nil {
   185  		return errors.WithStack(err)
   186  	}
   187  	return nil
   188  }
   189  
   190  func (v *Vendor) SelectById(ctx context.Context, db *gorm.DB, dml dbvendor.DMLSchema, args ...interface{}) (map[string]interface{}, error) {
   191  	var (
   192  		statement string
   193  		err       error
   194  		rows      *sql.Rows
   195  	)
   196  	if statement, err = dbvendor.String(selectFromById, selectFromById, dml, dbvendor.Question); err != nil {
   197  		return nil, errors.WithStack(err)
   198  	}
   199  	sqlDB, err := db.DB()
   200  	if err != nil {
   201  		return nil, errors.WithStack(err)
   202  	}
   203  	if rows, err = sqlDB.QueryContext(ctx, statement, args...); err != nil {
   204  		return nil, errors.WithStack(err)
   205  	}
   206  	result := make([]map[string]interface{}, 0)
   207  	dbvendor.Scan(rows, &result)
   208  	if len(result) == 0 {
   209  		return nil, errors.WithStack(sql.ErrNoRows)
   210  	}
   211  	return result[0], nil
   212  }