mysql go命令_一行命令实现mysql转go struct

okcli 可以将指定数据表生成为对应的model文件,目前支持将列名、数据类型、默认值、注释带入指定model中,

就像如下文件:

import "time"

type (

Student struct {

Id int32 `db:"id"`

Name string `db:"name"` // the student's name

Gender int8 `db:"gender"` // the student's gender,0-male,1-female,DEFAULT:0

Age int8 `db:"age"` // the student's age,DEFAULT:0

Class string `db:"class"` // the student's class

CreateTime time.Time `db:"create_time"` // the column create time,DEFAULT:CURRENT_TIMESTAMP

UpdateTime time.Time `db:"update_time"` // the column last update time,DEFAULT:CURRENT_TIMESTAMP

}

)

准备工作

根据自己的操作系统平台下载不同的二进制文件

或者clone源码进行编译。

其次,将下载或编译后的二进制文件设置到环境变量中,以mac OS为例子:

假设二进制文件okcli存放在/usr/local/okcli文件目录下

$ sudo vi ~/.bash_profile

在文件末尾添加:

$ export OKCLI=/usr/local/okcli

$ export PATH=$PATH:$OKCLI

最后执行以下source ~/.bash_profile

使用说明

数据库准备

这里以本地数据库举例,在demo库下新建student、course、student_score表,sql如下:

CREATE TABLE `student` (

`id` int(20) NOT NULL AUTO_INCREMENT,

`name` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'the student''s name',

`gender` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'the student''s gender,0-male,1-female',

`age` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT 'the student''s age',

`class` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'the student''s class',

`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'the column create time',

`update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'the column last update time',

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Student info';

CREATE TABLE `course` (

`id` int(20) NOT NULL AUTO_INCREMENT,

`name` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'course name',

`teacher` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'teach person',

`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,

`update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

CREATE TABLE `student_score` (

`id` int(20) NOT NULL,

`student_id` int(20) NOT NULL DEFAULT '0',

`course_id` int(20) NOT NULL DEFAULT '0',

`score` tinyint(3) unsigned NOT NULL,

`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,

`update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

PRIMARY KEY (`id`),

KEY `student_course_unique` (`student_id`,`course_id`),

KEY `course_idx` (`course_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

okcli命令准备

命令行参数

$ okcli

NAME:

okcli - a cli tool to generate model

USAGE:

okcli [global options] command [command options] [arguments...]

VERSION:

0.0.1

COMMANDS:

init generate the json configuration template

gen generated from a configuration file

help, h Shows a list of commands or help for one command

GLOBAL OPTIONS:

--help, -h show help

--version, -v print the version

生成model

1、配置文件生成

$ okcli init

执行命令后将会在当前目录生成一个config.json文件,内容模板如下:

// TODO: FILLED IN YOUR REAL VALUE AND DELETE THIS LINE

{

"username": "root",

"password": "123456",

"host": "localhost:3306",

"database":{

"name":"demo",

"tables":["student","course","student_score"]

},

"tagPrefix":"db"

}

username:

数据库连接名

password:

数据库连接密码

host:

数据库连接地址

database:

数据库名称和数据表名列表

tagPrefix:

待格式化model中tag的前缀,默认为"db"

将config.json配置文件修改为你需要连接的数据库地址,填入待生成model的数据库名和表名。

2、执行okcli gen 命令

$ okcli gen -c ./config.json -o ./model

successful,the path: /Users/anqiansong/go/src/okgo/model/student.go

successful,the path: /Users/anqiansong/go/src/okgo/model/course.go

successful,the path: /Users/anqiansong/go/src/okgo/model/studentscore.go

c 指定配置文件路径

o 指定model文件存放目录,默认为当前目录

执行以上命令将按照配置文件生成对应model文件,并存放在model文件夹中,如果指定model文件已经存在,则会提示你

WARNING:the file [student.go] would be override,Y/N?

3、生成model文件

Student

package model

import "time"

type (

Student struct {

Id int32 `gorm:"id"`

Name string `gorm:"name"` // the student's name

Gender int8 `gorm:"gender"` // the student's gender,0-male,1-female,DEFAULT:0

Age int8 `gorm:"age"` // the student's age,DEFAULT:0

Class string `gorm:"class"` // the student's class

CreateTime time.Time `gorm:"create_time"` // the column create time,DEFAULT:CURRENT_TIMESTAMP

UpdateTime time.Time `gorm:"update_time"` // the column last update time,DEFAULT:CURRENT_TIMESTAMP

}

)

Course

package model

import "time"

type (

Course struct {

Id int32 `gorm:"id"`

Name string `gorm:"name"` // course name

Teacher string `gorm:"teacher"` // teach person

CreateTime time.Time `gorm:"create_time"`

UpdateTime time.Time `gorm:"update_time"`

}

)

StudentScore

package model

import "time"

type (

StudentScore struct {

Id int32 `gorm:"id"`

StudentId int32 `gorm:"student_id"`

CourseId int32 `gorm:"course_id"`

Score int8 `gorm:"score"`

CreateTime time.Time `gorm:"create_time"`

UpdateTime time.Time `gorm:"update_time"`

}

)

注意事项

model文件生成后目前可支持代码格式化,但是暂不支持包的自动引入,因此,在生成文件后你需要对model文件的

包进行检查导入。

结尾

如有对你有帮助,请帮忙点击一下在github给一下你的小星星作为我前进的动力。

有疑问加站长微信联系(非本文作者)

5c5fbae790ec0313d6ee17e8b3dd9ba1.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spark中,可以通过JDBC连接MySQL数据库并使用`upsert`语句来执行插入或更新操作。具体实现如下: 1. 导入必要的依赖: ```xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.23</version> </dependency> ``` 2. 创建一个`DataFrame`,并指定`DataFrame`的schema。假设需要将数据插入到名为`users`的MySQL表中,表结构如下: ```sql CREATE TABLE users ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(100), age INT, PRIMARY KEY (id) ); ``` 则可以定义如下的schema: ```scala import org.apache.spark.sql.types._ val schema = StructType(Seq( StructField("name", StringType), StructField("age", IntegerType) )) ``` 3. 读取数据并将其换为`DataFrame`: ```scala val rdd = sc.parallelize(Seq( ("Alice", 25), ("Bob", 30), ("Charlie", 35) )) val df = spark.createDataFrame(rdd).toDF("name", "age") ``` 4. 将`DataFrame`写入到MySQL表中: ```scala val url = "jdbc:mysql://localhost:3306/mydb" val user = "username" val password = "password" df.write .format("jdbc") .option("url", url) .option("dbtable", "users") .option("user", user) .option("password", password) .option("driver", "com.mysql.jdbc.Driver") .option("rewriteBatchedStatements", "true") .option("batchsize", "10000") .mode("append") .save() ``` 在上述代码中,`url`用于指定MySQL数据库的连接地址,`user`和`password`用于指定数据库的用户名和密码,`dbtable`用于指定要写入的表名,`driver`用于指定MySQL的JDBC驱动程序。 `rewriteBatchedStatements`和`batchsize`用于优化写入性能。`rewriteBatchedStatements`设置为`true`时,表示使用批量写入模式,可以提高写入性能。`batchsize`用于指定每批次写入的记录数。 5. 如果需要执行`upsert`操作,则可以使用MySQL的`REPLACE INTO`语句或`ON DUPLICATE KEY UPDATE`语句。例如,如果需要根据`name`字段更新记录,则可以使用如下的SQL语句: ```sql INSERT INTO users (name, age) VALUES (?, ?) ON DUPLICATE KEY UPDATE age=VALUES(age) ``` 在Spark中,可以通过以下方式执行`upsert`操作: ```scala df.write .format("jdbc") .option("url", url) .option("dbtable", "users") .option("user", user) .option("password", password) .option("driver", "com.mysql.jdbc.Driver") .option("rewriteBatchedStatements", "true") .option("batchsize", "10000") .option("rewriteBatchedStatements", "true") .option("rewriteBatchedStatements", "true") .option("rewriteBatchedStatements", "true") .option("rewriteBatchedStatements", "true") .option("rewriteBatchedStatements", "true") .option("rewriteBatchedStatements", "true") .option("rewriteBatchedStatements", "true") .option("rewriteBatchedStatements", "true") .option("rewriteBatchedStatements", "true") .option("rewriteBatchedStatements", "true") .option("rewriteBatchedStatements", "true") .option("rewriteBatchedStatements", "true") .option("rewriteBatchedStatements", "true") .option("rewriteBatchedStatements", "true") .option("rewriteBatchedStatements", "true") .option("rewriteBatchedStatements", "true") .option("rewriteBatchedStatements", "true") .option("rewriteBatchedStatements", "true") .mode("append") .jdbc(url, "users", prop) ``` 在上述代码中,`prop`是一个包含`user`和`password`属性的`java.util.Properties`对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值