zeromicro / go-zero

A cloud-native Go microservices framework with cli tool for productivity.
https://go-zero.dev
MIT License
29.43k stars 3.97k forks source link

【文档踩坑+报错提醒】goctl model mysql ddl 生成代码报错信息不明确 #740

Closed jeffrey-lunaon closed 3 years ago

jeffrey-lunaon commented 3 years ago

根据教程 定义数据库表结构,并生成 CRUD+cache 代码,创建了 sql 文件,个人盲改了下,导致 SQL 有一些错误,但报错信息并不明确,靠猜想是我 SQL 语句出了问题,修改正确后指令正确执行正常结束。

多加了 ,,或者加索引的语法不正确等都会触发不同的错误, syntax error at position xxx ,且没什么规律

执行过程截图如下:

CREATE TABLE `shorturl`
(
    `shorten` varchar(255) NOT NULL COMMENT 'shorten key',
    `url`     varchar(255) NOT NULL COMMENT 'original url',
    PRIMARY KEY (`shorten`),
    INDEX url_idx(`url`(20))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

image

wangerzi commented 3 years ago

示例里边的 SQL 在 Server version: 5.6.51 MySQL Community Server (GPL) 下会创建失败,会触发索引过长的错误 ,过长也会导致索引页存放的条目数降低,导致索引存储和查询的效率不高。 粗略根据字节数算了下,把 shorten 改成 150 后 MySQL 5.6 默认配置运行下执行成功,望文档内修复提示下,给后来人提个醒。

错误信息如下: [2021-05-30 14:07:12] [42000][1071] Specified key was too long; max key length is 767 bytes

ldmid666 commented 3 years ago

而且自定义主键别名的时候无法编译成功 PRIMARY KEY pk_id(id)

kesonan commented 3 years ago

针对大家提的这个问题,我们正在考虑修复方案,目前使用的是一个sqlparser库,对解析支持还是比较弱,我们尽快商讨方案去解决这个语法解析不准确问题。目前如果大家在使用过程中遇到解析问题,建议通过datasource途径生成,感谢大家对goctl的支持!

greyireland commented 3 years ago

无法根据单列索引生成缓存代码

goctl model mysql datasource -url="root:greyireland@tcp(localhost:3306)/gozero" -table="user" -c -dir .

CREATE TABLE `user` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `age` int NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_age` (`age`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

UserModel interface {
    Insert(data User) (sql.Result, error)
    FindOne(id int64) (*User, error)
    Update(data User) error
    Delete(id int64) error
}

goctl版本 goctl -version goctl version 1.1.6 darwin/amd64

kesonan commented 3 years ago

无法根据单列索引生成缓存代码

goctl model mysql datasource -url="root:greyireland@tcp(localhost:3306)/gozero" -table="user" -c -dir .

CREATE TABLE `user` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `age` int NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_age` (`age`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

UserModel interface {
    Insert(data User) (sql.Result, error)
    FindOne(id int64) (*User, error)
    Update(data User) error
    Delete(id int64) error
}

goctl版本 goctl -version goctl version 1.1.6 darwin/amd64

普通索引生成代码不会有缓存,只有唯一索引才会带索引缓存哈,主键会有缓存在里面的,你可以看一下model生成的相关文档说明

NeesonD commented 3 years ago

sqlparser 这个库已经几年没更新了,对很多语法不支持。还是用datasource吧

kesonan commented 3 years ago

@NeesonD 目前已经在开发针对ddl的解析器了,可以关注一下zeromicro/ddl-parser进度