Halo semuanya.
Selama lima tahun pertama karir pemrograman saya, saya mengerjakan proyek in-house, selama tujuh tahun berikutnya saya bekerja di berbagai startup, dengan tim yang terdiri dari maksimal lima pengembang.
Sekarang saya telah bekerja selama beberapa bulan pada sebuah proyek dengan 20+ pengembang, pekerjaan dilakukan secara bersamaan di sekitar 30 cabang, ada lima lingkungan untuk pengembangan kode (draf, dev, pengujian, perbaikan terbaru, prod), setiap lingkungan memiliki database-nya sendiri (sebelum meluncurkan kamit ke stand / environment, peluncuran pengujian dilakukan menggunakan database terpisah, yaitu, kami memiliki 10 database terpisah untuk lima lingkungan).
Berkembang di banyak cabang bukanlah hal baru bagi saya, saya selalu melakukannya. Penemuan bagi saya adalah bahwa versi kode dan versi skema database tidak disinkronkan dengan cara apa pun. Dalam proyek kecil, tidak menjadi masalah untuk menghapus seluruh skema dan menggulungnya secara keseluruhan, ini membutuhkan beberapa menit; dalam proyek ini, menggulirkan skema dari awal dengan penyemaian membutuhkan waktu dari satu jam.
Ada masalah besar dengan cara menyinkronkan versi kode dan versi skema database.
Di bawah ini saya akan memberi tahu Anda tentang peraturan yang telah saya terima untuk diri saya sendiri dan saya akan senang jika Anda membagikan teknik dan teknik yang membantu Anda mengatasi bencana ini.
Penolakan
Kode yang disajikan di bawah ini adalah kode pertempuran yang dikaburkan, saya belum men-debugnya, mungkin perlu dimodifikasi dengan file. Saya hanya berbagi ide dengan Anda.
Deskripsi masalah
, , , - -. .
, - , , , , , ? , ?
, , . , , , . , .
.
: " "
, . , migrations, , , .
, .
:
#
php artisan migrate --path="services/best-team-servise/database/migrations/2021_02_04_240000_alter_data_model_table_add_unique_index.php" --pretend
# --pretend SQL ,
#
php artisan migrate:rollback --step=1
# ,
,
php artisan ide-helper:models "Project\Models\DataModel"
:
php artisan db:seed --class=DataModelSeeder
? up() down() , , .
, , , .
Builder :
$conn = (new DataModel())->connection;
$builder = Schema::connection($conn);
( ):
$isExists = $builder->hasColumn(
'data_model',
'deleted_at'
);
, :
if (!$isExists) {
$builder->table(
'data_model',
function (Blueprint $table) {
$table->softDeletesTz();
}
);
}
- , - , , , :
$alias = (new DataModel())->connection;
$builder = Schema
::connection($alias)
->getConnection()
->getDoctrineSchemaManager();
$existingIndexes = $builder->listTableIndexes('data_model');
Laravel , :
Blueprint::unique('index_name');
:
Blueprint::dropUnique('index_name');
Laravel , , , SQL, Laravel ? , !
SQL, :
DROP TRIGGER IF EXISTS trigger_name
ON public.data_model;
CREATE TRIGGER trigger_name
BEFORE INSERT
ON public.data_model
FOR EACH ROW
EXECUTE PROCEDURE public.function_name();
, :
DROP TRIGGER IF EXISTS trigger_name
ON public.data_model;
: " "
, 1000+ . 1000 , .
, 50+ , "" .
, create, alter, , drop.
.
alter_data_model_add_property_column alter_data_model_alter_property_column_to_text alter_data_model_alter_property_column_set_default_value alter_data_model_create_index_on_code_type_columns alter_data_model_create_unique_index_on_code_column
, , MVP.
:
#
php artisan make:migration create_profile_table --create=profile
#
php artisan make:migration add_confirmed_to_profile --table=profile
database/migrations , .
: , nullable()
, NOT NULL, , , , .
, .
nullable(), , .
, , - :
$columns = Schema
::connection((new DataModel())->connection)
->getConnection()
->getDoctrineSchemaManager()
->listTableColumns($(new DataModel())->getTable());
$data = [];
foreach ($columns as $column) {
$name = $column->getName();
/* @var array[] $record */
$exists = key_exists($name, $record);
if ($exists) {
$data[$name] = $record[$name];
}
}
$isSuccess = DataModel
::withTrashed()
->updateOrCreate(
['uniqe_index_column' => $data['uniqe_index_column'],],
$data
)->exists;
: , null
, , , , , .
Atau Anda dapat menggunakan beberapa nilai default dalam kode, tetapi saya tidak suka metode ini, karena ini adalah kode yang sulit, dan ini membunuh fleksibilitas aplikasi kita. Operasi aplikasi harus dikonfigurasi baik melalui variabel lingkungan, atau file konfigurasi, atau catatan database.
Kesimpulan
Seperangkat aturan ini tentu saja tidak mutlak, pertama-tama kita berpaling dan menggunakan akal sehat.
Mari kita bahas di kolom komentar. Silakan bagikan pengalaman Anda.