gpt4 book ai didi

mysql - Rails 在模式加载时损坏二进制字段默认值

转载 作者:行者123 更新时间:2023-11-29 02:12:13 26 4
gpt4 key购买 nike

我的 schema.rb 中的这个条目:

create_table "my_settings", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t|
t.string "IMEI", limit: 25, null: false
t.binary "enabled", limit: 1, default: "b'0'", null: false
t.integer "output_channel", default: 1, null: false
t.binary "inverse_relay", limit: 1, default: "b'0'", null: false
t.integer "message_syntax", default: 0, null: false
end

rails db:schema:load RAILS_ENV=test 期间生成以下 SQL 和错误消息,这导致我的测试套件无法使用:

ActiveRecord::StatementInvalid: Mysql2::Error: Invalid default value for 'enabled': CREATE TABLE `my_settings` 
(`id` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
`IMEI` varchar(25) NOT NULL,
`enabled` varbinary(1) DEFAULT x'62273027' NOT NULL,
`output_channel` int DEFAULT 1 NOT NULL,
`inverse_relay` varbinary(1) DEFAULT x'62273027' NOT NULL,
`message_syntax` int DEFAULT 0 NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=latin1

如您所见,二进制字段的默认值不匹配。知道为什么 Rails 会破坏这些值吗?我的 schema.rb 文件是 UTF-8 编码的,以防相关。我将 Rails 5.1 与托管在我的 Macbook 上的 MYSQL 5.7.15 一起用于我的测试套件。

非常感谢。

编辑:根据要求,SHOW CREATE TABLE 语句:

CREATE TABLE `my_settings` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`IMEI` varchar(25) NOT NULL,
`enabled` bit(1) NOT NULL DEFAULT b'0',
`output_channel` int(11) NOT NULL DEFAULT '1',
`inverse_relay` bit(1) NOT NULL DEFAULT b'0',
`message_syntax` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5140 DEFAULT CHARSET=latin1

最佳答案

Rails 喜欢将 bool 列表示为 TINYINT(1) 而不是位或 bool 列,至少在涉及 MySQL 时是这样。原始模式中 BIT(1) 字段的存在混淆了模式转储程序,它将默认值表示为二进制字符串 b'0'

虽然该字符串对 MySQL 有效,但 Rails 模式解释器认为这是某种字符串,因此当它编写迁移以创建该表的临时版本时,它会被损坏为 x'62273027' 这只是文字字符串 b'0' 的十六进制版本,其中 62b 等等。

解决此问题的方法是强制将原始列切换为 TINYINT(1) 并使其符合 Ruby 模式转储程序的预期,或者以 SQL 格式转储:

config.active_record.schema_format = :sql

生成 .sql 转储文件而不是 .rb 的转储文件。这可以更好地处理转储程序无法理解的模式。

关于mysql - Rails 在模式加载时损坏二进制字段默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48750156/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com