بارگیری داده های اولیه در Spring Boot
ما قبلاً طرح پایگاه داده را با استفاده از Hibernate، Flyway یا Liquibase مقداردهی اولیه کرده ایم. با این حال، علاوه بر طرحواره، ما اغلب به داده های خاصی نیاز دارند که در طول زمان اجرا برای برنامه ضروری است. این می تواند به عنوان مثال یک میز باشد Country
، که کد ISO و یک ارز در آن ذخیره می شود. چه گزینه هایی برای این کار در برنامه Spring Boot موجود است؟
با استفاده از ApplicationRunner
یک ApplicationRunner
بلافاصله پس از شروع برنامه Spring Boot ما اجرا می شود. اگر چندتایی باشد ApplicationRunners
در برنامه، آنها را نیز می توان با استفاده از ترتیب دلخواه مرتب کرد @Order
.
@Component
public class CountryLoader implements ApplicationRunner {
private final CountryRepository countryRepository;
@Autowired
public CountryLoader(final CountryRepository countryRepository) {
this.countryRepository = countryRepository;
}
public void run(final ApplicationArguments args) {
if (countryRepository.count() != 0) {
return;
}
final Country germany = new Country();
germany.setCode("DE");
germany.setCurrency("EUR");
countryRepository.save(germany);
final Country states = new Country();
states.setCode("US");
states.setCurrency("USD");
countryRepository.save(states);
}
}
استفاده از ApplicationRunner برای مقداردهی اولیه داده ها
این گزینه بالاترین انعطاف پذیری را فراهم می کند فرآیند را می توان به طور مستقیم در برنامه ما کنترل کرد.
با استفاده از data.sql
اگر ما با یک پایگاه داده رابطه ای کار می کنیم، می توانیم به سادگی a را قرار دهیم data.sql
در ما resources
پوشه این اسکریپت به طور خودکار توسط Spring Boot در برابر پیکربندی شده اجرا می شود DataSource
در طول راه اندازی
INSERT INTO country (code, currency) VALUES ('DE', 'EUR') ON CONFLICT DO NOTHING;
INSERT INTO country (code, currency) VALUES ('US', 'USD') ON CONFLICT DO NOTHING;
اسکریپت درج ویژه برای PostgreSQL
ما باید اطمینان حاصل کنید که مقادیر چندین بار ایجاد نمی شوند. اگر شمای پایگاه داده ما توسط Hibernate ایجاد شده است، باید ویژگی زیر را نیز اضافه کنیم تا اسکریپت ما فقط پس از اعمال تغییرات Hibernate اجرا شود.
spring:
jpa:
defer-datasource-initialization: true
اجرای data.sql بعد از Hibernate
استفاده از تغییرات ثبت شده
اگر Flyway یا Liquibase را برای تولید طرحواره انتخاب کردهایم، میتوانیم از آنها برای بارگذاری دادههای اولیه خود نیز استفاده کنیم. آنها به طور ضمنی اطمینان حاصل کنید که تغییرات دقیقا یک بار اجرا می شوند در برابر پایگاه داده متصل
در مورد Liquibase ما به سادگی تغییرات دیگری را با مهر زمانی بالاتر به ما اضافه می کنیم changelogs
پوشه
databaseChangeLog:
- changeSet:
id: countries-initial
author: bootify.io
changes:
- insert:
tableName: country
columns:
- column:
name: code
value: DE
- column:
name: currency
value: EUR
- insert:
tableName: country
columns:
- column:
name: code
value: US
- column:
name: currency
stringValue: USD
تغییرات Liquibase در منابع/changelogs/2023-01-18_11-00.yml
در مورد Flyway ما اسکریپت مهاجرت خود را ایجاد می کنیم مستقیماً در گویش پایگاه داده مورد استفاده. ما آن را در آن ذخیره می کنیم resources/db/migration/V002__INITIAL_COUNTRIES.sql
به طوری که بلافاصله پس از ایجاد ساختار جدول اجرا می شود.
INSERT INTO country (code, currency) VALUES ('DE', 'EUR');
INSERT INTO country (code, currency) VALUES ('US', 'USD');
_ اسکریپت مهاجرت Flyway _
هر سه راه گزینه های معتبری هستند برای مقداردهی اولیه داده های ما – بنابراین با توجه به اولویت خود انتخاب کنید. فقط باید از استفاده موازی از راه های متعدد اجتناب شود.
” بیشتر بدانید