NewLifeX / NewLife.XCode

数据中间件,支持MySQL、SQLite、SqlServer、Oracle、Postgresql、TDengine、达梦,重点在缓存、性能、分表、自动建表。
https://newlifex.com/xcode
MIT License
74 stars 33 forks source link

mysql中BLOB, TEXT, GEOMETRY 等类型字段不能设置默认值 #10

Closed DragonFlyEast closed 1 year ago

DragonFlyEast commented 1 year ago

很高兴能找到如此强大的项目,目前正在学习,使用过程中发现以下问题,

假设存在 eventfile 表,想实现按天分表,

DROP TABLE IF EXISTS `eventfile`;

CREATE TABLE `eventfile` (
  `Fid` bigint(20) NOT NULL COMMENT '文件id。雪花id',
  `EventDeviceId` bigint(20) NOT NULL COMMENT '设备id',
  `EventJobId` bigint(20) NOT NULL COMMENT '任务id',
  `SkillId` bigint(20) NOT NULL DEFAULT '0' COMMENT '技能',
  `SavePath` varchar(512) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '保存路径。',
  `Results` mediumtext COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '结果',
  `DeleteStatus` tinyint(1) NOT NULL DEFAULT '0' COMMENT '删除状态',
  `CreateTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`Fid`) USING BTREE,
  KEY `idx_deviceId_jobId_createTime` (`EventDeviceId`,`EventJobId`,`CreateTime`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='事件';

在对应生成的实体类 eventfile 静态构造函数中加入分表策略,代码如下

static Eventfile()
        {
            // 按天分表
            Meta.ShardPolicy = new TimeShardPolicy(nameof(Fid), Meta.Factory)
            {
               TablePolicy = "{0}_{1:yyyyMMdd}",
               Step = TimeSpan.FromDays(1),
            };

            // 过滤器 UserModule、TimeModule、IPModule
            Meta.Modules.Add<TimeModule>();
        }

当引用该实体用下面的代码进行插入操作时,会提示建表失败,

var eventFile = new Eventfile()
                                        {
                                            Fid = fid,
                                            EventDeviceId = ....,
                                            EventJobId = ...,
                                            SkillId = ...,
                                            SavePath = ...,
                                            Results = results
                                        };
eventFile.Insert();

日志如下,

01:59:12.731  6 Y 2 待检查数据表:eventfile_20230330
01:59:12.734  6 Y 2 创建表:eventfile_20230330(事件)
01:59:12.754  6 Y 2  Create Table If Not Exists eventfile_20230330(
    Fid BIGINT NOT NULL DEFAULT 0 COMMENT '文件id。雪花id',
    EventDeviceId BIGINT NOT NULL DEFAULT 0 COMMENT '设备id',
    EventJobId BIGINT NOT NULL DEFAULT 0 COMMENT '任务id',
    SkillId BIGINT NOT NULL DEFAULT 0 COMMENT '技能ID',
    SavePath VARCHAR(512) NOT NULL DEFAULT '' COMMENT '保存路径。',
    Results LONGTEXT NOT NULL DEFAULT '' COMMENT '结果',
    DeleteStatus TINYINT NOT NULL DEFAULT 0 COMMENT '删除状态',
    CreateTime DATETIME NOT NULL DEFAULT '0001-01-01' COMMENT '创建时间',
    Primary Key (Fid)
) DEFAULT CHARSET=utf8mb4;
01:59:12.776  6 Y 2 修改表CreateTable失败!BLOB, TEXT, GEOMETRY or JSON column 'Results' can't have a default value[SQL:
 Create Table If Not Exists eventfile_20230330(
    Fid BIGINT NOT NULL DEFAULT 0 COMMENT '文件id。雪花id',
    EventDeviceId BIGINT NOT NULL DEFAULT 0 COMMENT '设备id',
    EventJobId BIGINT NOT NULL DEFAULT 0 COMMENT '任务id',
    SkillId BIGINT NOT NULL DEFAULT 0 COMMENT '技能ID',   
    SavePath VARCHAR(512) NOT NULL DEFAULT '' COMMENT '保存路径。',
    Results LONGTEXT NOT NULL DEFAULT '' COMMENT '结果',
    DeleteStatus TINYINT NOT NULL DEFAULT 0 COMMENT '删除状态',
    CreateTime DATETIME NOT NULL DEFAULT '0001-01-01' COMMENT '创建时间',
    Primary Key (Fid)
) DEFAULT CHARSET=utf8mb4;
][DB:Smart/MySql]

另外 insertAsync() 方法不会自动建表吗,上面的插入如果换用异步方法会提示 表 eventfile_20230330 不存在

感谢大佬开源如此强的项目!!

nnhy commented 1 year ago

InsertAsync 等异步接口处于试验阶段,还没有长时间经验积累