mysql 检查哪些项目_mysql根据内容查询在哪个表.go
package main
import (
"database/sql"
"errors"
"fmt"
"github.com/go-ini/ini"
_ "github.com/go-sql-driver/mysql"
termbox "github.com/nsf/termbox-go"
"time"
)
//全局變量
var (
db *sql.DB
ip string
port string
username string
password string
database string
wait_time int
content string
)
//初始化ini文件
func initIni() error {
cfg, err := ini.Load("my.ini")
if err != nil {
return errors.New("ini文件讀取失敗")
}
ip = cfg.Section("mysql").Key("ip").String()
port = cfg.Section("mysql").Key("port").String()
username = cfg.Section("mysql").Key("username").String()
password = cfg.Section("mysql").Key("password").String()
database = cfg.Section("mysql").Key("database").String()
content = cfg.Section("mysql").Key("content").String()
wait_time, err = cfg.Section("mysql").Key("wait_time").Int()
if err != nil {
return errors.New("wait_time參數不是整數")
}
return nil
}
//初始化mysql
func initDB() (err error) {
var dsn = fmt.Sprintf("%s:%s@tcp(%s:%s)/%s", username, password, ip, port, database)
//Open只會驗證dsb的格式是否正確,不會驗證是否連接成功,同理,密碼是否正確也不知道
db, err = sql.Open("mysql", dsn)
if err != nil {
return errors.New("格式錯誤")
}
// 此時嘗試連接數據庫,會判斷用戶,密碼,ip地址,端口是否正確
err = db.Ping()
if err != nil {
return errors.New("配置錯誤")
}
return nil
}
type Table struct {
//表名
TableName string
}
// 根據數據庫獲取當前數據庫下所有表
func DatabaseToTables() ([]Table, error) {
var sqlStr = "show TABLES;"
rows, err := db.Query(sqlStr)
if err != nil {
return nil, errors.New("查詢失敗")
}
defer rows.Close()
var tables = make([]Table, 0, 100)
for rows.Next() {
var table Table
err = rows.Scan(&table.TableName)
if err != nil {
return nil, errors.New("綁定數據失敗")
}
tables = append(tables, table)
}
return tables, nil
}
type Field struct {
//列名
ColumnName string
}
// 根據表名獲取當前表所有字段
func TableToFields(table string) ([]Field, error) {
var sqlStr = "select COLUMN_NAME from information_schema.COLUMNS where table_name = '%s';"
sqlStr = fmt.Sprintf(sqlStr, table)
rows, err := db.Query(sqlStr)
if err != nil {
return nil, errors.New("查詢失敗")
}
defer rows.Close()
var fields = make([]Field, 0, 100)
for rows.Next() {
var field Field
err = rows.Scan(&field.ColumnName)
if err != nil {
return nil, errors.New("綁定數據失敗")
}
fields = append(fields, field)
}
return fields, nil
}
//根據字段一一查詢
func FieldSelect(table, field, content string) (map[string]string, error) {
//fmt.Println(table, field, content)
var sqlStr = "SELECT * from %s where %s like '%%%s%%';"
sqlStr = fmt.Sprintf(sqlStr, table, field, content)
rows, err := db.Query(sqlStr)
if err != nil {
return nil, errors.New("sql查詢失敗")
}
//函數結束釋放鏈接
defer rows.Close()
//sql轉map
result, err := ScanRow(rows)
if err != nil {
return nil, err
}
return result, nil
}
//獲取單個
func ScanRow(rows *sql.Rows) (map[string]string, error) {
//讀出查詢出的列字段名
cols, _ := rows.Columns()
//values是每個列的值,這里獲取到byte里
values := make([][]byte, len(cols))
//query.Scan的參數,因為每次查詢出來的列是不定長的,用len(cols)定住當次查詢的長度
scans := make([]interface{}, len(cols))
//讓每一行數據都填充到[][]byte里面,貍貓換太子
for i := range values {
scans[i] = &values[i]
}
//獲取單行必須Next()
rows.Next()
//傳指針進去,但是不通過指針能獲取值
err := rows.Scan(scans...)
if err != nil {
return nil, errors.New("Scan失敗")
}
row := make(map[string]string)
for k, v := range values {
//cols[k]為字段名
key := cols[k]
row[key] = string(v)
}
return row, nil
}
func pause() {
fmt.Println("請按任意鍵繼續...")
Loop:
for {
switch ev := termbox.PollEvent(); ev.Type {
case termbox.EventKey:
break Loop
}
}
}
func main() {
//初始化ini
err := initIni()
if err != nil {
fmt.Println("錯誤:", err)
pause()
return
}
//初始化mysql
err = initDB()
if err != nil {
fmt.Println("錯誤:", err)
pause()
return
}
//開始時間
begin_time := time.Now()
// begin:主要邏輯,三層for循環
//根據數據庫獲取當前數據庫下所有表
tables, err := DatabaseToTables()
if err != nil {
fmt.Println("錯誤:", err)
pause()
return
}
for _, table := range tables {
fields, err := TableToFields(table.TableName)
if err != nil {
fmt.Println("錯誤:", err)
pause()
return
}
for _, field := range fields {
_, err := FieldSelect(table.TableName, field.ColumnName, content)
//err != nil表示查詢失敗,繼續下次查詢
if err != nil {
continue
}
//fmt.Println(row)
fmt.Printf("表名:%s,列名:%s\n", table.TableName, field.ColumnName)
//睡眠指定時間
time.Sleep(time.Millisecond * time.Duration(wait_time))
}
}
elapsed_time := time.Now().Sub(begin_time)
fmt.Println("運行時間:", elapsed_time)
//任意鍵結束
pause()
//end:主要邏輯
}
一鍵復制
編輯
Web IDE
原始數據
按行查看
歷史
總結
以上是生活随笔為你收集整理的mysql 检查哪些项目_mysql根据内容查询在哪个表.go的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wamp测试mysql_Wamp 配置及
- 下一篇: mysql的错误代码1064_mysql