Migratsiyalar
Kirish
Bir necha odam ilovalarni ishlab chiqishda hamkorlik qilganda, sinxronizatsiya uchun standartlashtirilgan ma'lumotlar bazasi tuzilishiga ega bo'lish juda muhimdir. Bunisiz, har bir kishining individual ma'lumotlari mos kelmasligi sababli tartibsizlik yuzaga kelishi mumkin. Ma'lumotlar bazasi migratsiyasi bu muammoning yechimidir. Ma'lumotlar bazasi tuzilishi versiyalarni boshqarish orqali barcha ishlab chiquvchilar orasida uning izchilligini ta'minlash uchun nazorat qilinadi.
Konfiguratsiya
Ma'lumotlar bazasi migratsiya fayllari database/migrations katalogida saqlanadi. Siz config/database.go faylida ma'lumotlar bazasi ulanish ma'lumotlarini sozlashingiz mumkin.
"migratsiyalar": map[string]any{
// Siz migratsiyalar jadvalining nomini o'zgartirishingiz mumkin
"table": "migratsiyalar",
}Migratsiyalarni yaratish
Migratsiyani yaratish uchun make:migration buyrug'idan foydalaning:
./artisan make:migration
./artisan make:migration create_users_tableBu buyruq database/migrations katalogida migratsiya fayllarini yaratadi. Har bir migratsiya fayli vaqt belgisi bilan boshlanadi, Goravel migratsiya fayllarini bajarish tartibini aniqlash uchun undan foydalanadi.
Shuningdek, siz -m yoki --model opsiyasidan foydalanib, ma'lum bir model uchun migratsiya yaratishingiz mumkin:
./artisan make:migration create_users_table -m UserModel buyrug'ni ishga tushirishdan oldin bootstrap/app.go faylida ro'yxatdan o'tkazilishi kerak. Bu buyruq User modelida belgilangan tuzilish asosida migratsiya faylini yaratadi.
func Boot() contractsfoundation.Application {
return foundation.Setup().
WithConfig(config.Boot).
WithCallback(func() {
facades.Schema().Extend(schema.Extension{
Models: []any{models.User{}},
})
}).
Create()
}Tez yaratish
create_users_table dan foydalanib, users jadvalining infratuzilmasini o'z ichiga olgan jadvalni avtomatik yarating:
^create_(\w+)_table$
^create_(\w+)$users jadvaliga maydonlar qo'shish uchun tuzilmani avtomatik yaratish uchun add_avatar_to_users_table dan foydalaning:
_(to|from|in)_(\w+)_table$
_(to|from|in)_(\w+)$Yuqoridagi shartlar bajarilmagan taqdirda, framework bo‘sh migratsiya faylini yaratadi.
Migratsiya tuzilmasi
Go Tili Migratsiyasi
Migratsiya strukturasida ikkita metod mavjud: Up va Down. Up usuli ma'lumotlar bazasiga yangi jadvallar, ustunlar yoki indekslar qo'shish uchun ishlatiladi, Down usuli esa Up usuli tomonidan bajarilgan amallarni bekor qilish uchun ishlatiladi. Ushbu ikki usulda siz facades.Schema() yordamida ma'lumotlar bazasi jadvallarini yaratish va boshqarish mumkin. Mavjud usullar uchun hujjatga qarang. Quyidagi migratsiya users jadvalini yaratadi:
migratsiyalar paketi
import (
"github.com/goravel/framework/contracts/database/schema"
"goravel/app/facades"
)
type M20241207095921CreateUsersTable struct {
}
// Imzo Migratsiyaning noyob imzosi.
func (r *M20241207095921CreateUsersTable) Signature() string {
return "20241207095921_create_users_table"
}
// Yuqoriga Migratsiyalarni ishga tushiring.
func (r *M20241207095921CreateUsersTable) Up() error {
if !facades.Schema().HasTable("users") {
return facades.Schema().Create("users", func(table schema.Blueprint) {
table.ID()
table.String("name").Nullable()
table.String("email").Nullable()
table.Timestamps()
})
}
return nil
}
// Pastga Migratsiyalarni teskari aylantiring.
func (r *M20241207095921CreateUsersTable) Down() error {
return facades.Schema().DropIfExists("users")
}Migratsiya ulanishini o'rnatish
Agar migratsiya ilovaning standart ma'lumotlar bazasi ulanishidan boshqa ma'lumotlar bazasi ulanishi bilan o'zaro ta'sirlashsa, siz migratsiyaning Connection metodidan foydalanishingiz kerak:
func (r *M20241207095921CreateUsersTable) Connection() string {
return "connection-name"
}Migratsiyalarni ro'yxatdan o'tkazish
make:migration tomonidan yaratilgan yangi migratsiya bootstrap/migrations.go::Migrations() funksiyasida avtomatik ravishda ro'yxatga olinadi va funksiya WithMigrations tomonidan chaqiriladi. Agar siz migratsiya faylini o'zingiz yaratsangiz, qoidani qo'lda ro'yxatdan o'tkazishingiz kerak.
func Boot() contractsfoundation.Application {
return foundation.Setup().
WithMigrations(Migrations).
WithConfig(config.Boot).
Create()
}Migratsiyalarni ishga tushirish
Barcha qoldirilgan migratsiyalaringizni ishga tushirish uchun migrate Artisan buyrug'ini bajaring:
./artisan migrateAgar hozirgacha qaysi migratsiyalar ishlaganini ko'rmoqchi bo'lsangiz, migrate:status Artisan buyrug'idan foydalanishingiz mumkin:
./artisan migrate:statusMigratsiyalarni Orqaga Qaytarish
Oxirgi migratsiya to'plamini orqaga qaytarish uchun rollback Artisan buyrug'idan foydalaning:
./artisan migrate:rollbackAgar siz bir nechta migratsiya to'plamlarini orqaga qaytarmoqchi bo'lsangiz, batch opsiyasini belgilashingiz mumkin, raqam qaysi to'plamni orqaga qaytarish kerakligini ko'rsatadi:
./artisan migrate:rollback --batch=2Siz rollback buyrug'iga step opsiyasini berib, cheklangan migratsiyalarni qaytarishingiz mumkin. Masalan, quyidagi buyruq oxirgi beshta migratsiyani orqaga qaytaradi:
./artisan migrate:rollback --step=5migrate:reset buyrug'u ilovangizning barcha migratsiyalarini orqaga qaytaradi:
./artisan migrate:resetBitta buyruq yordamida orqaga qaytarish va migratsiya qilish
migrate:refresh buyrug'i barcha migratsiyalaringizni orqaga qaytaradi va keyin migrate buyrug'ini bajaradi. Bu buyruq sizning butun ma'lumotlar bazangizni samarali ravishda qayta yaratadi:
./artisan migrate:refreshSiz refresh buyrug'iga step opsiyasini berib, cheklangan migratsiyalarni orqaga qaytarish va qayta migratsiya qilishingiz mumkin. Masalan, quyidagi buyruq oxirgi besh migratsiyani orqaga qaytaradi va qayta migratsiya qiladi:
./artisan migrate:refresh --step=5Barcha Jadval va Migratsiyalarni O'chirish
migrate:fresh buyrug'i ma'lumotlar bazasidagi barcha jadvallarni o'chirib tashlaydi va keyin migrate buyrug'ini bajaradi:
./artisan migrate:freshJadvallar
Jadval yaratish
facades.Schema().Create("users", func(table schema.Blueprint) {
table.ID()
table.String("name").Nullable()
table.String("email").Nullable()
table.Timestamps()
})Jadval / Ustun Mavjudligini Tekshirish
if facades.Schema().HasTable("users") {}
if facades.Schema().HasColumn("users", "email") {}
if facades.Schema().HasColumns("users", []string{"name", "email"}) {}
if facades.Schema().HasIndex("users", "email_unique") {}Ma'lumotlar bazasi ulanishi
facades.Schema().Connection("sqlite").Create("users", func(table schema.Blueprint) {
table.ID()
})Jadvalni yangilash
facades.Schema().Table("users", func(table schema.Blueprint) {
table.String("name").Nullable()
})Ustun nomini o'zgartirish
facades.Schema().Table("users", func(table schema.Blueprint) {
table.RenameColumn("old_name", "new_name")
})Jadval izohini qo'shish
facades.Schema().Table("users", func(table schema.Blueprint) {
table.Comment("user table")
})Jadvalni qayta nomlash / O‘chirish
facades.Schema().Rename("users", "new_users")
facades.Schema().Drop("users")
facades.Schema().DropIfExists("users")Ustunlar
Mavjud ustun turlari
Mantiqiy turlar
Mantiqiy
Satr va matn turlari
Char, Json, LongText, MediumText, String, Text, LongText, TinyText, Uuid, Ulid
Raqamli turlar
BigIncrements, BigInteger, Decimal, Double, Float, ID, Increments, Integer, IntegerIncrements, MediumIncrements, MediumInteger, SmallIncrements, SmallInteger, TinyIncrements, TinyInteger, UnsignedBigInteger, UnsignedInteger, UnsignedMediumInteger, UnsignedSmallInteger, UnsignedTinyInteger
Sana va Vaqt Turlari
Sana, SanaVaqt, SanaVaqtTz, YumshoqO'chirishlar, YumshoqO'chirishlarTz, Vaqt, VaqtTz, VaqtBelgisi, VaqtBelgisiTz, VaqtBelgilari, VaqtBelgilariTz
Boshqa turlar
Enum, Morflar, NullableMorflar, NumericMorflar, UuidMorflar, UlidMorflar
Enum
[]any turidagi bo‘yicha Mysql da saqlanishi mumkin bo‘lgan Enum maydonini yarating, lekin Postgres, Sqlite va Sqlserver ma’lumotlar bazalarida u String turidir.
table.Enum("qiyinlik", []any{"oson", "qiyin"})
table.Enum("raqam", []any{1, 2})ID
ID usuli BigIncrements usulining taxallusidir. Standart holda, ushbu usul id ustunini yaratadi; ammo, agar siz ustunga boshqa nom berishni istasangiz, ustun nomini o'tkazishingiz mumkin:
jadval.ID()
jadval.ID("foydalanuvchi_id")Yumşoq o'chirishlar
SoftDeletes usuli deleted_at TIMESTAMP ustunini qo‘shadi. Bu ustun Orm "yumshoq o'chirish" funksiyasi uchun zarur bo'lgan deleted_at vaqt belgisini saqlash uchun mo'ljallangan:
table.SoftDeletes()Maxsus ustun
Agar siz freymvork hali qo'llab-quvvatlamaydigan ustun turlaridan foydalanayotgan bo'lsangiz, maydon turini sozlash uchun Column metodidan foydalanishingiz mumkin:
table.Column("geometriya", "geometriya")Ustun modifikatorlari
Yuqorida keltirilgan ustun turlaridan tashqari, ma'lumotlar bazasi jadvaliga ustun qo'shganda, siz shuningdek, ustunga "modifikatorlar" qo'shishingiz mumkin. Masalan, ustunni "null qiymat qabul qiluvchi" qilish uchun Nullable metodidan foydalanishingiz mumkin:
facades.Schema().Table("users", func(table schema.Blueprint) {
table.String("name").Nullable()
})Quyidagi jadvalda barcha mavjud ustun modifikatorlari keltirilgan:
| O'zgartirilgan | Tavsif |
|---|---|
.Har doim() | Ushbu ustunning qiymati har doim ma'lumotlar bazasi tizimi tomonidan yaratiladi va foydalanuvchilar uni to'g'ridan-to'g'ri kiritish yoki o'zgartirishlari mumkin emas (faqat PostgreSQL) |
.AutoIncrement() | Butun sonli ustunni avtomatik o'sish (asosiy kalit) sifatida belgilaydi |
.After("ustun") | Belgilangan ustundan keyingi ustunni o‘rnatadi (faqat MySQL) |
.Comment("mening izohim") | Ustunga izoh qo'shadi (MySQL / PostgreSQL) |
| `.Change() | Ustun tuzilishini o'zgartirish (MySQL / PostgreSQL / Sqlserver) |
.Default(value) | Ustunning standart qiymatini belgilaydi |
.First() | Ustunni birinchi ustun sifatida belgilaydi (faqat MySQL) |
.GeneratedAs() | Ushbu ustunning qiymatini ma'lumotlar bazasi tizimi tomonidan yaratilishi uchun belgilaydi (faqat PostgreSQL) |
.Nullable() | Ustunga NULL qiymatlarni kiritishga ruxsat beradi |
.Unsigned() | Butun sonli ustunni UNSIGNED qilib belgilaydi (faqat MySQL uchun) |
.UseCurrent() | Jadval ustuniga standart qiymat sifatida CURRENT_TIMESTAMP ni belgilaydi |
.UseCurrentOnUpdate() | Yozuv yangilanganda CURRENT_TIMESTAMP dan foydalanish uchun vaqt belgisi ustunini belgilaydi (faqat MySQL) |
Ustunni tashlash
facades.Schema().Table("users", func(table schema.Blueprint) {
table.DropColumn("name")
table.DropColumn("name", "age")
})Indekslar
Indeks yaratish
facades.Schema().Table("users", func(table schema.Blueprint) {
// Asosiy kalitni qo'shish
table.Primary("id")
// Kompozit asosiy kalitni qo'shish
table.Primary("id", "name")
// Yagona indeksni qo'shish
table.Unique("name")
table.Unique("name", "age")
// Oddiy indeksni qo'shish
table.Index("name")
table.Index("name", "age")
// To'liq matn indeksini qo'shish
table.FullText("name")
table.FullText("name", "age")
})Indeksni nomini o'zgartirish
facades.Schema().Table("users", func(table schema.Blueprint) {
table.RenameIndex("users_name_index", "users_name")
})Indeksni tashlash
facades.Schema().Table("users", func(table schema.Blueprint) {
table.DropPrimary("id")
table.DropUnique("name")
table.DropUniqueByName("name_unique")
table.DropIndex("name")
table.DropIndexByName("name_index")
table.DropFullText("name")
table.DropFullTextByName("name_fulltext")
})Tashqi kalit yaratish
facades.Schema().Table("posts", func(table schema.Blueprint) {
table.UnsignedBigInteger("user_id")
table.Foreign("user_id").References("id").On("users")
})Tashqi kalitni olib tashlash
facades.Schema().Table("users", func(table schema.Blueprint) {
table.DropForeign("user_id")
table.DropForeignByName("user_id_foreign")
})