V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hu1e
V2EX  ›  程序员

求指导 -- 数据库增量脚本方案

  •  
  •   hu1e · 2022-12-02 17:22:08 +08:00 · 2379 次点击
    这是一个创建于 720 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在做数据库设计工具,请教一个问题

    比如这是数据库的第一版设计

    CREATE TABLE `users` (
      `id` integer,
      `name` varchar(255),
      `password` varchar(255),
      `sex` varchar(255),
      `email` varchar(255),
      `phone` varchar(255),
      `avatar` varchar(255),
      `last_login` timestamp
    );
    

    这是第二版

    CREATE TABLE `users` (
      `id` integer,
      `name` varchar(255),
      `password` varchar(255),
      `sex` varchar(255),
    );
    

    如何通过基于第一版,通过增量命令来实现第二版的结果

    ALTER TABLE...
    

    有这种通过对比不同表字段直接生成结果的库吗

    14 条回复    2022-12-03 20:06:03 +08:00
    silov
        1
    silov  
       2022-12-02 17:50:32 +08:00
    歪个楼先,性别这个字段一般用 gender 而不是 sex [溜了
    v2wtf
        2
    v2wtf  
       2022-12-02 17:53:36 +08:00
    @silov sex 并无不妥,老外的开源项目里用 sex 的感觉更多。
    WhiteDragon96
        3
    WhiteDragon96  
       2022-12-02 18:14:38 +08:00
    ALTER TABLE `users` DROP COLUMN `email`; 这个意思?
    rozbo
        4
    rozbo  
       2022-12-02 18:47:44 +08:00
    搜 code first ,根据不同语言不同框架有不同的方案
    rekulas
        5
    rekulas  
       2022-12-02 18:53:22 +08:00
    主要变化也就字段、索引
    如果不考虑触发器外键之类的自己解析感觉也很简单
    Belmode
        6
    Belmode  
       2022-12-02 19:04:19 +08:00 via Android
    flyway
    tiaod
        7
    tiaod  
       2022-12-02 22:32:01 +08:00
    @v2wtf 讲道理没有用 xingbie 或者 XB 已经很给面子了
    optional
        8
    optional  
       2022-12-03 09:27:38 +08:00
    老老实实用 migration 工具
    brader
        9
    brader  
       2022-12-03 09:48:33 +08:00
    不怕你见笑,我平时变动表结构,都是在 navicat 连测试库,表设计页面改动表结构后,把 sql 预览下的 alter 语句复制起来,需求上线了,就把这语句放到生产库执行。
    notnul
        10
    notnul  
       2022-12-03 10:24:52 +08:00
    flayway
    aitaii
        11
    aitaii  
       2022-12-03 10:57:48 +08:00
    自己写基于 binlog
    victorc
        12
    victorc  
       2022-12-03 11:20:23 +08:00
    这都是不接地气的做法

    ALTER TABLE 这种暴力操作,在线上实施非常危险,实际干的时候都是单独拎出来 ,战战兢兢,三思而后行

    另外从兼容和交付角度,db 字段一般只加不删
    jptx
        13
    jptx  
       2022-12-03 12:03:42 +08:00
    楼上说的对,生产环境的数据库,字段最好只增不删,新表可以弃用旧字段,但旧字段最好不要物理删除,否则将来回滚、历史数据追溯等操作很麻烦。

    另外针对你的需求,不建议使用一些库去实时生成 DDL 语句直接执行,不可控因素太多。建议在上线之前借助工具提取出 DDL 语句,比如 Navicat 的“工具”——“结构同步”,可以帮你对比两个库,并且帮你生成 DDL 语句。拿着这些 DDL 语句人工一条条审核,必要时做一些修改,等上线期间执行 DDL 语句即可。
    hamsterbase
        14
    hamsterbase  
       2022-12-03 20:06:03 +08:00
    您可以使用 ALTER TABLE 语句来更新表的结构。要在第一版的表中删除 email 、phone 和 avatar 字段,并删除 last_login 字段,您可以执行以下操作:

    ```
    ALTER TABLE users
    DROP COLUMN email,
    DROP COLUMN phone,
    DROP COLUMN avatar,
    DROP COLUMN last_login;

    ```
    您也可以使用 ALTER TABLE 语句来重命名表中的字段,或者更改字段的数据类型。

    至于有没有通过对比不同表字段直接生成结果的库,我不太清楚。这种库可能需要在两个表中进行比较,然后根据比较结果生成 ALTER TABLE 语句,但我并不知道是否有这样的库。




    以上全部文字都通过 ai 生成,输入为 OP 帖子全文,输出一字未改。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1719 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:45 · PVG 00:45 · LAX 08:45 · JFK 11:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.