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

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