Giriş
Şu satırı dahil ederiz
import org.flywaydb.core.api.callback.Callback; import org.flywaydb.core.api.callback.Context; import org.flywaydb.core.api.callback.Event;
Flyway Callbacks kullanım senaryosu şöyle
Rebuilding materialized views – we might want to rebuild materialized views whenever we apply migrations affecting the base tables of those views. SQL callbacks are a good fit for executing this type of logicFlushing a cache – perhaps we have a migration that modifies data that happens to be cached. We can use callbacks to flush caches making sure that our application pulls fresh data from the databaseCalling an external system – using callbacks, we can call out to an external system using an arbitrary technology. For example, we might want to publish an event, send an email, or trigger a server restart
Örnek - AFTER_MIGRATE
Şöyle yaparız
@Component  
public class CsvUpsertCallback implements Callback {  
  @Autowired  
  private ResourceLoader resourceLoader;  
  @Override  
  public String getCallbackName() { return "csv_upsert_callback";}  
  @Override  
  public boolean supports(Event event, Context context) { 
    return event == Event.AFTER_MIGRATE;
  }  
  @Override  
  public boolean canHandleInTransaction(Event event, Context context) {return true;}  
  @Override  
  public void handle(Event event, Context context) {  
    Connection connection = context.getConnection();  
    try {  
      // Get the path to the CSV directory  
      PathMatchingResourcePatternResolver resolver = 
        new PathMatchingResourcePatternResolver(resourceLoader);  
      Resource[] resources = resolver.getResources("classpath:csv/*");  
      List<File> files = new ArrayList<>();  
      for (Resource resource : resources) {  
        File file = resource.getFile();  
        if (file.getName().toLowerCase().endsWith(".csv")){  
          files.add(file);  
        }  
      }  
     for (File csvFile : files) {  
       processCsvFile(csvFile, connection);  
     }  
    } catch (IOException | SQLException e) {  
      throw new SQLException("Error processing CSV files", e);  
    }  
  }   
}Şöyle yaparız
private void processCsvFile(File csvFile, Connection connection)
throws IOException, SQLException {  
  String tableName = "my_table";  
  try (BufferedReader reader = new BufferedReader(new FileReader(csvFile))) {  
    String line;  
    while ((line = reader.readLine()) != null) {  
      // Split the line into columns  
      String[] columns = line.split(",");  
      
      // Perform UPSERT operation  
      String sql = "INSERT INTO " + tableName + " (id, name, email) " +  
          "VALUES (?, ?, ?) " +  
          "ON CONFLICT (id) " +  
          "DO UPDATE SET name = EXCLUDED.name, email = EXCLUDED.email";  
      
      try (PreparedStatement statement = connection.prepareStatement(sql)) {  
       statement.setInt(1, Integer.parseInt(columns[0]));  
       statement.setString(2, columns[1]);  
       statement.setString(3, columns[2]);  
       statement.executeUpdate();  
      }  
    }  
  }  
} 
Hiç yorum yok:
Yorum Gönder