gpt4 book ai didi

ruby-on-rails - 在 rails 中将列类型更改为更长的字符串

转载 作者:行者123 更新时间:2023-11-29 11:04:49 24 4
gpt4 key购买 nike

在第一次迁移时,我在 content 列上声明为字符串根据 annotate gem,Activerecord 使其成为 string(255)。

在我将应用程序推送到使用 postgres 的 heroku 之后,如果我在 content 的表单中输入一个长度超过 255 的字符串,我会收到错误

PGError: ERROR: value too long for type character varying(255)

问题是我需要该内容包含一个可能非常长的字符串(自由文本,可能是数千个字符)

  1. pg 接受什么变量(字符串不适合这个)?
  2. 如何创建迁移以替换该列的类型

谢谢

最佳答案

你应该使用 text如果您想要一个没有长度限制的字符串,请使用 Rails。像这样的迁移:

def up
change_column :your_table, :your_column, :text
end
def down
# This might cause trouble if you have strings longer
# than 255 characters.
change_column :your_table, :your_column, :string
end

应该解决问题。你可能想要 :null => false或最后的一些其他选项。

当您使用 string没有明确限制的列,Rails 将添加隐式 :limit => 255 .但是如果你使用 text ,您将获得数据库支持的任意长度的字符串类型。 PostgreSQL 允许您使用 varchar没有长度的列,但大多数数据库为此使用单独的类型,Rails 不知道 varchar没有长度。你必须使用 text在 Rails 中得到 text column在 PostgreSQL 中。在 PostgreSQL 中,类型为 text 的列之间没有区别和类型之一 varchar (但是 varchar(n) 不同)。此外,如果您在 PostgreSQL 之上进行部署,则没有理由使用 :string (又名 varchar ),数据库处理 textvarchar(n)除了 varchar(n) 的额外长度限制外,内部相同;你应该只使用 varchar(n) (又名 :string )如果您对列大小有外部约束(例如政府表格规定表格 897/B 上的字段 432 的长度为 23 个字符)。

顺便说一句,如果您使用的是 string任何位置的列,您应该始终指定 :limit提醒自己有一个限制,您应该在模型中进行验证以确保不超过限制。如果超过限制,PostgreSQL 会报错并抛出异常,MySQL 会悄悄地截断字符串或​​报错(取决于服务器配置),SQLite 会让它按原样通过,而其他数据库会做其他事情(可能会报错) .

此外,您还应该在同一个数据库(在 Heroku 中通常是 PostgreSQL)之上进行开发、测试和部署,您甚至应该使用相同版本的数据库服务器。 ActiveRecord 不会将您隔离于数据库之间的其他差异(例如 GROUP BY 的行为)。您可能已经在这样做了,但我想我还是要提一下。


更新:较新版本的 ActiveRecord 可以理解 varchar没有限制,至少对于 PostgreSQL,你可以说:

change_column :your_table, :your_column, :string, limit: nil

改变varchar(n)列到 varchar . textvarchar就 PostgreSQL 而言,它们仍然是同一件事,但一些表单构建器会以不同的方式对待它们:varchar得到一个 <input type="text">text获取多行 <textarea> .

关于ruby-on-rails - 在 rails 中将列类型更改为更长的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8694273/

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