exec.go 1.63 KB
package lxmysql

import (
	"github.com/astaxie/beego/orm"
	"io/ioutil"
	"os"
	"strings"
)

type ExecSqlConfig struct {
	Sql        string    //表名
	TableName  string    //表名
	DBIndex    string    //指定数据库
	Orm        orm.Ormer //实例化 ORM
	CreaeSql   string    //创建表的SQL语句
	CreatePath string    //创建表的SQL文件路径
}

func ExecSql(config ExecSqlConfig) (err error) {

	var (
		tcount int
	)

	if config.Orm == nil {
		config.Orm = orm.NewOrm()
	}

	if config.DBIndex == "" {
		config.DBIndex = "default"
	}

RSTART:

	config.Orm.Using(config.DBIndex)

	_, err = config.Orm.Raw(config.Sql).Exec()
	if err != nil {
		if b := strings.Contains(err.Error(), "doesn't exist"); b && (config.CreaeSql != "" || config.CreatePath != "") && tcount == 0 {
			if config.CreaeSql == "" {
				config.CreaeSql, _ = readFilesql(config.CreatePath, config.TableName)
			}

			//表不存在 去创建
			err = CreateTable(config.CreaeSql, config.Orm, config.DBIndex)
			if err != nil {
				return
			}

			tcount++
			//重新执行一次
			goto RSTART
		}

		return

	}

	return
}

func CreateTable(csql string, o orm.Ormer, dbindex string) (err error) {

	o.Using(dbindex)

	_, err = o.Raw(csql).Exec()
	if err != nil {
		return
	}

	return
}

func readFilesql(pth, tbname string) (sql string, err error) {
	filePtr, err := os.Open(pth)
	if err != nil {
		return
	}
	defer filePtr.Close()

	by, err := ioutil.ReadAll(filePtr)
	if err != nil {
		return
	}

	sql = strings.Replace(string(by), "{tablename}", tbname, -1)

	return
}

func ReadFilesql(pth, tbname string) (sql string, err error) {

	pth += ".sql"

	return readFilesql(pth, tbname)
}