sql >> Databáze >  >> RDS >> PostgreSQL

Změna typu sloupu na delší řetězce v kolejnicích

Měli byste použít text s Rails, pokud chcete řetězec bez omezení délky. Migrace jako je tato:

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

by měl věci vyřešit. Možná budete chtít :null => false nebo některé další možnosti na konci.

Když použijete string sloupec bez explicitního limitu, Rails přidá implicitní :limit => 255 . Ale pokud použijete text , získáte libovolný typ řetězce libovolné délky, který databáze podporuje. PostgreSQL vám umožňuje použít varchar sloupec bez délky, ale většina databází pro to používá samostatný typ a Rails nezná varchar bez délky. Musíte použít text v Rails, abyste získali text sloupec v PostgreSQL. V PostgreSQL není žádný rozdíl mezi sloupcem typu text a jeden typu varchar (ale varchar(n) je odlišný). Navíc, pokud nasazujete nad PostgreSQL, není důvod používat :string (AKA varchar ) vůbec, databáze zpracovává text a varchar(n) totéž interně kromě omezení délky navíc pro varchar(n); měli byste používat pouze varchar(n) (AKA :string ) pokud máte externí omezení (např. vládní formulář, který říká, že pole 432 na formuláři 897/B bude mít 23 znaků) na velikost sloupce.

Kromě toho, pokud používáte string kdekoli, měli byste vždy zadat :limit jako připomenutí, že existuje limit a měli byste mít v modelu ověření, abyste zajistili, že limit nebude překročen. Pokud limit překročíte, PostgreSQL si bude stěžovat a vyvolá výjimku, MySQL tiše zkrátí řetězec nebo si stěžuje (v závislosti na konfiguraci serveru), SQLite to nechá projít tak, jak je, a ostatní databáze udělají něco jiného (pravděpodobně si budou stěžovat) .

Také byste měli vyvíjet, testovat a nasazovat na stejnou databázi (což bude obvykle PostgreSQL v Heroku), dokonce byste měli používat stejné verze databázového serveru. Existují další rozdíly mezi databázemi (jako je chování GROUP BY), od kterých vás ActiveRecord neizoluje. Možná to už děláte, ale přesto jsem si myslel, že to zmíním.

Aktualizovat :Novější verze ActiveRecord rozumí varchar bez omezení, takže alespoň s PostgreSQL můžete říci:

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

pro změnu varchar(n) sloupec na varchar . text a varchar jsou stále stejné, pokud jde o PostgreSQL, ale někteří tvůrci formulářů s nimi budou zacházet jinak:varchar získá <input type="text"> zatímco text získá víceřádkový <textarea> .



  1. Připojení PolyBase k Salesforce.com

  2. Převést „datetime2“ na „smalldatetime“ v SQL Server (příklady T-SQL)

  3. Jak se připojit k MS SQL Server pomocí Inno Setup?

  4. Jak ukládat obrázky do varbinary (max) sloupce?