sql >> Database teknologi >  >> RDS >> PostgreSQL

Ændring af en søjletype til længere strenge i skinner

Du skal bruge text med Rails, hvis du ønsker en streng uden længdebegrænsning. En migration som denne:

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

skal ordne tingene. Du vil måske have :null => false eller nogle andre muligheder i slutningen af ​​det også.

Når du bruger en string kolonne uden en eksplicit grænse, vil Rails tilføje en implicit :limit => 255 . Men hvis du bruger text , får du den strengtype af vilkårlig længde, som databasen understøtter. PostgreSQL giver dig mulighed for at bruge en varchar kolonne uden en længde, men de fleste databaser bruger en separat type til det, og Rails kender ikke til varchar uden længde. Du skal bruge text i Rails for at få en text kolonne i PostgreSQL. Der er ingen forskel i PostgreSQL mellem en kolonne af typen text og en af ​​typen varchar (men varchar(n) er forskellige). Desuden, hvis du implementerer oven på PostgreSQL, er der ingen grund til at bruge :string (AKA varchar ) i det hele taget behandler databasen text og varchar(n) det samme internt bortset fra de ekstra længdebegrænsninger for varchar(n); du bør kun bruge varchar(n) (AKA :string ) hvis du har en ekstern begrænsning (såsom en regeringsformular, der siger, at felt 432 på formular 897/B vil være 23 tegn langt) på kolonnestørrelsen.

Som en sidebemærkning, hvis du bruger en string kolonne hvor som helst, bør du altid angive :limit som en påmindelse til dig selv om, at der er en grænse, og du bør have en validering i modellen for at sikre, at grænsen ikke overskrides. Hvis du overskrider grænsen, vil PostgreSQL klage og rejse en undtagelse, MySQL vil stille og roligt afkorte strengen eller klage (afhængigt af serverkonfigurationen), SQLite vil lade det passere som det er, og andre databaser vil gøre noget andet (sandsynligvis klage) .

Du bør også udvikle, teste og implementere oven på den samme database (som normalt vil være PostgreSQL hos Heroku), du bør endda bruge de samme versioner af databaseserveren. Der er andre forskelle mellem databaser (såsom opførsel af GROUP BY), som ActiveRecord ikke vil isolere dig fra. Du gør måske allerede dette, men jeg tænkte, at jeg ville nævne det alligevel.

Opdater :Nyere versioner af ActiveRecord forstår varchar uden en grænse, så med PostgreSQL i det mindste kan du sige:

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

for at ændre en varchar(n) kolonne til varchar . text og varchar er stadig det samme, hvad PostgreSQL angår, men nogle formbyggere vil behandle dem anderledes:varchar får en <input type="text"> hvorimod text får en multi-line <textarea> .



  1. Sådan fungerer ROUND() i MariaDB

  2. Hvordan bruger jeg spring data jpa til at forespørge på jsonb-kolonnen?

  3. Konfiguration af et dedikeret netværk til tilgængelighedsgruppekommunikation

  4. Forbindelse af applikationer, der kører på Linux, til Amazon Relational Database Services (RDS) til SQL Server