go开发mysql

linux安装数据库

1、下载

    下载地址:http://dev.mysql.com/downloads/mysql/5.6.html#downloads
    下载版本:我这里选择的5.6.33,通用版,linux下64位
    也可以直接复制64位的下载地址,通过命令下载:wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.33-linux-glibc2.5-x86_64.tar.gz
2、解压
#解压
tar -zxvf mysql-5.6.33-linux-glibc2.5-x86_64.tar.gz
#复制解压后的mysql目录
cp -r mysql-5.6.33-linux-glibc2.5-x86_64 /usr/local/mysql
3、添加用户组和用户
#添加用户组
groupadd mysql
#添加用户mysql 到用户组mysql
useradd -g mysql mysql
4、安装

cd /usr/local/mysql

mkdir ./data/mysql

chown -R mysql:mysql ./
./scripts/mysql_install_db --user=mysql --datadir=/usr/local/mysql/data/mysql
cp support-files/mysql.server /etc/init.d/mysqld
chmod 755 /etc/init.d/mysqld
cp support-files/my-default.cnf /etc/my.cnf
 
#修改启动脚本
vi /etc/init.d/mysqld
 
#修改项:
basedir=/usr/local/mysql/
datadir=/usr/local/mysql/data/mysql
 
#启动服务
service mysqld start
 
#测试连接
./mysql/bin/mysql -uroot
 
#加入环境变量,编辑 /etc/profile,这样可以在任何地方用mysql命令了
export PATH=$PATH:/usr/local/mysql/bin
source /etc/profile
 
 
#关闭mysql
service mysqld stop
#查看运行状态
service mysqld status


客户端使用:
把mysql客户端放到默认路径
ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql
mysql -uroot -p     // Mysql的登录命令应该是mysql -u用户名 -p密码

直接回车,然后就登陆成功,执行show databases;可以查看数据库。


客户端推荐工具"Navicat for MySQL"

问题

host is not allowed to connect mysql

    在装有MySQL的机器上登录MySQL mysql -u root -p密码
    执行use mysql;
    执行update user set host = '%' where user = 'root';这一句执行完可能会报错,不用管它。
    执行FLUSH PRIVILEGES;

二进制安装mysql初始化出现:Installing MySQL system tables.../usr/local/mysql/bin/mysqld: error while loading shared
原因:缺少libaio库文件
解决方法:yum install libaio* -y

FATAL ERROR: please install the following Perl modules before executing /usr/local/mysql/scripts/mysql_install_db:

初始化默认数据库运行此命令:/usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql/     出现此错误。
解决方法 :安装autoconf库 命令:yum-y install autoconf   //此包安装时会安装Data:Dumper模块

ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'mysql'
在my.ini的[mysqld]字段加入:
skip-grant-tables
重启mysql服务,这时的mysql不需要密码即可登录数据库
然后进入mysql
mysql>use mysql;
mysql>update user set password=password('新密码') WHERE User='root';
mysql>flush privileges;
运行之后最后去掉my.ini中的skip-grant-tables,重启mysqld即可。
mysql 1040错误
执行select VARIABLE_VALUE from information_schema.GLOBAL_VARIABLES where VARIABLE_NAME='MAX_CONNECTIONS';

set global max_connections = 3600;

实践

Go语言开发

go操作mysql的驱动包很多,这里讲解当下比较流行的Go-SQL-Driver/MySQL
1.下载安装
  执行下面两个命令:

    下载:go get github.com/Go-SQL-Driver/MySQL
     安装:go install github.com/Go-SQL-Driver/MySQL
  安装完成以后的文件截图
  root/go_s是go工作目录,环境变量:$GOPATH中设置的值
2.导入包
  import (
          "database/sql"
          _"github.com/Go-SQL-Driver/MySQL"
  )

3.链接数据库
  Open函数:
  db, err := sql.Open("mysql", "用户名:密码@tcp(IP:端口)/数据库?charset=utf8")
  例如:db, err := sql.Open("mysql", "root:111111@tcp(127.0.0.1:3306)/test?charset=utf8")

4.增删改查
  下面例子中的表结构:
  CREATE TABLE `userinfo` (
      `uid` int(10) NOT NULL AUTO_INCREMENT,
      `username` varchar(64) DEFAULT NULL,
      `departname` varchar(64) DEFAULT NULL,
      `created` date DEFAULT NULL,
      PRIMARY KEY (`uid`)
   ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

增加
有两种方法:
1.直接使用Exec函数添加
  result, err := db.Exec("INSERT INTO userinfo (username, departname, created) VALUES (?, ?, ?)","lily","销售","2016-06-21")
2.首先使用Prepare获得stmt,然后调用Exec添加
  stmt, err := db.Prepare("INSERT userinfo SET username=?,departname=?,created=?")
  res, err := stmt.Exec("zhja", "研发", "2016-06-17")
另一个经常用到的功能,获得刚刚添加数据的自增ID
  id, err := res.LastInsertId()


删除
删除和上面的增加语法一样,只是把其中的INSERT语句改为DELETE语句
修改
修改和上面的增加语法一样,只是把其中的INSERT语句改为UPDATE语句

查询
查询单条数据,QueryEow 函数
  var username, departname, created string
  err := db.QueryRow("SELECT username,departname,created FROM userinfo WHERE uid=?", 3).Scan(&username, &departname, &created)
 
查询多条数据,并遍历
  Query 获取数据,for xxx.Next() 遍历数据

5.事务
在操作数据库之前执行,db.Begin()
例:tx, err := db.Begin()
保存到数据库:err := tx.Commit()
回滚:err := tx.Rollback()
注意设置事务以后操作数据库就不是db了,而是tx

例子:
 
func main(){
    db, err := sql.Open("mysql", "root:111111@tcp(127.0.0.1:3306)/test?charset=utf8")
 
    checkErr(err)
 
 
    rows, err := db.Query("SELECT username,departname,created FROM userinfo WHERE username=?", "zhja")
    checkErr(err)
    for rows.Next() {
        var username, departname, created string
        if err := rows.Scan(&username, &departname, &created); err == nil {
            fmt.Println(err)
        }
        fmt.Println(username)
        fmt.Println(departname)
        fmt.Println(created)
    }
 
    tx, err := db.Begin()
    checkErr(err)
    stmt, err1 := tx.Prepare("INSERT INTO userinfo (username, departname, created) VALUES (?, ?, ?)")
    checkErr(err1)
    _, err2 := stmt.Exec("test", "测试", "2016-06-20")
    checkErr(err2)
    //err3 := tx.Commit()
    err3 := tx.Rollback()
    checkErr(err3)
}
 
func checkErr(err error){
    if err != nil {
        panic(err)
    }

}

C语言开发

#include <mysql/mysql.h> 

void db_query()
{

  MYSQL mysql;
     mysql_init(&mysql);

     if ( NULL == mysql_real_connect(&mysql,g_dbip.c_str(),
     g_dbusr.c_str(),g_dbpwd.c_str(),g_dbname.c_str(),0,NULL,0)) {
        main_thread::get_instance()->add_log("mysql_real_connect(): %s\n",
         mysql_error(&mysql));
      return;
    }
    printf("connect success!\n");
    
    char sql[128] = {0};
    sprintf(sql,"select code_id, seat, rtmpUrl from pro_channel_state");
    int ret = mysql_real_query(&mysql,sql,strlen(sql));

    if(ret) {
        printf("failed to query:%s\n",mysql_error(&mysql));
        return;
    }

    MYSQL_RES *res;
    res = mysql_store_result(&mysql);

    if (NULL == res) {
        printf("mysql_restore_result() faild\n");
        return;
    }

    int rows = mysql_num_rows(res);
    printf("The total rows is: %d\n", rows);
    int fields = mysql_num_fields(res);
    printf("The total fields is: %d\n", fields);

    MYSQL_ROW row;

    while ((row = mysql_fetch_row(res))) {
        string  code_id = row[0];
        string  seat = row[1];
        string  rtmpurl = row[2];
        printf("%s \t %s \t %s", code_id.c_str(), seat.c_str(), rtmpurl.c_str());
      string id = code_id + seat;
         g_Map.insert(TStrStrPair(id, rtmpurl));
        thread rtmp_thread(rtmp_core, g_cpid,  code_id, seat, g_svradd);
        rtmp_thread.detach();
        sleep(1);
     }

    mysql_free_result(res);
    mysql_close(&mysql);
}

编译命令:

gcc mysqltest.c -lmysqlclient


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值