rails 3/postgres - какова длина строки, если вы не применяете :limit в схеме

Мой googlefu, должно быть, слаб, потому что я не могу найти ничего, что могло бы сказать мне ограничение по умолчанию для строкового столбца в моем приложении Rails (размещенном в Heroku, с использованием PostgreSQL в качестве базы данных).

Любая помощь будет оценена по достоинству!


person jpw    schedule 14.11.2011    source источник


Ответы (2)


ActiveRecord использует varchar(255) (или character varying (255) для педантизма), если вы не укажете конкретное ограничение. Вы всегда можете перейти в PostgreSQL с помощью psql и произнести \d your_table, чтобы получить таблицу так, как ее видит PostgreSQL.

Я не думаю, что значение по умолчанию указано где-либо, но это прямо здесь, в исходнике:

NATIVE_DATABASE_TYPES = {
  :primary_key => "serial primary key",
  :string      => { :name => "character varying", :limit => 255 },
  #...

Ближе всего к спецификации находится в Руководстве по миграции:

Они будут сопоставлены с соответствующим базовым типом базы данных, например, с MySQL :string отображается на VARCHAR(255).

Но это не про PostgreSQL и не совсем гарантия.


Кроме того, если вы используете PostgreSQL, вы почти всегда должны идти прямо к :text и делать вид, что :string не существует. PostgreSQL внутренне обрабатывает их одинаково, за исключением того, что он должен выполнять проверку длины varchar. Здесь, в другом моем ответе, есть еще немного обсуждения: Изменение типа столбца на более длинные строки в рельсах.

person mu is too short    schedule 14.11.2011

В rails 4 нет ограничения по умолчанию для строкового типа, как вы можете видеть в источник:

NATIVE_DATABASE_TYPES = {
        primary_key: "serial primary key",
        bigserial: "bigserial",
        string:      { name: "character varying" },
        text:        { name: "text" },
        #...

если вы не укажете ограничение, ActiveRecord просто установит character varying, и вы сможете сохранить там строку любой длины, как указано в документация:

Если переменный символ используется без спецификатора длины, тип принимает строки любого размера.

person kirlev    schedule 16.02.2015