rails 3 / postgres - какова длина строки, если вы не применяете: предел в схеме - PullRequest
12 голосов
/ 15 ноября 2011

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

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

Ответы [ 2 ]

21 голосов
/ 15 ноября 2011

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. Здесь немного больше обсуждается в одном из моих ответов: Изменение типа столбца на более длинные строки в рельсах .

7 голосов
/ 16 февраля 2015

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

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

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

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

...