Maak een Ruby-script voor het automatiseren van gegevensmigratie tussen databases
description
Dit bespaart je tijd en vermindert fouten bij handmatige gegevensmigratie, en biedt een betrouwbare methode voor het overdragen van gegevens tussen databases.
prompt
try_prompt
Help me een Ruby-script schrijven dat de migratie van gegevens van {{bron_database}} naar {{doel_database}} automatiseert. Geef de tabellen en velden die ik moet migreren, samen m ... more
generate_helper
...
ai_answers
provider: openai
model: gpt-4.1-nano
Hier is een voorbeeld Ruby-script dat de migratie van gegevens van een bron MySQL-database naar een doel MySQL-database automatiseert. Het script biedt basisfunctionaliteit, inclusief foutafhandeling en logging. Pas het script aan je specifieke tabellen en velden aan.
```ruby
require 'mysql2'
require 'logger'
# Configuratie
BRON_DB_CONFIG = {
host: 'localhost',
username: 'gebruiker',
password: 'wachtwoord',
database: 'bron_db'
}
DOEL_DB_CONFIG = {
host: 'localhost',
username: 'gebruiker',
password: 'wachtwoord',
database: 'doel_db'
}
LOG_FILE = 'migratie.log'
# Initialize logger
logger = Logger.new(LOG_FILE)
logger.level = Logger::INFO
# Connecties maken
begin
bron_client = Mysql2::Client.new(BRON_DB_CONFIG)
doel_client = Mysql2::Client.new(DOEL_DB_CONFIG)
logger.info("Verbonden met bron- en doel-databases.")
rescue Mysql2::Error => e
puts "Fout bij verbinden met database: #{e.message}"
logger.fatal("Verbindingsfout: #{e.message}")
exit
end
# Definieer je tabellen en velden die je wilt migreren
# Bijvoorbeeld:
migratie_schema = {
'tabel1' => {
'velden' => ['id', 'naam', 'datum'],
'transformaties' => {
'datum' => :format_datum # voorbeeld transformatie
}
},
# Voeg meer tabellen toe indien nodig
}
# Helper functie voor datumformattering
def format_datum(value)
# Pas aan op basis van je datumformaat
Date.parse(value).strftime('%Y-%m-%d') rescue nil
end
# Migratieproces
migratie_schema.each do |tabel, info|
begin
# Lees alle gegevens uit de bron tabel
resultaten = bron_client.query("SELECT #{info['velden'].join(', ')} FROM #{tabel}")
resultaten.each do |row|
# Pas transformaties toe
if info['transformaties']
info['transformaties'].each do |veld, transactie|
waarde = row[veld]
case transactie
when :format_datum
row[veld] = format_datum(waarde)
# Voeg meer transformaties toe indien nodig
end
end
end
# Maak een insert statement voor de doel-database
velden = info['velden']
waarden = velden.map { |v| "'#{bron_client.escape(row[v].to_s)}'" }
insert_sql = "INSERT INTO #{tabel} (#{velden.join(', ')}) VALUES (#{waarden.join(', ')})"
# Voer de insert uit
doel_client.query(insert_sql)
logger.info("Geseed: #{tabel} - #{row}")
end
rescue Mysql2::Error => e
puts "Fout bij migreren van tabel #{tabel}: #{e.message}"
logger.error("Fout bij tabel #{tabel}: #{e.message}")
end
end
# Sluit de verbindingen
bron_client.close
doel_client.close
logger.info("Migratie voltooid en verbindingen gesloten.")
```
**Aanpassingen die je moet maken:**
- Vervang de `migratie_schema` met je eigen tabellen en velden.
- Voeg eventuele transformaties toe in de `transformaties` hash.
- Pas de datumnotaties en andere transformaties aan indien nodig.
- Controleer of je juiste escape-methoden gebruikt om SQL-injectie te voorkomen.
**Let op:**
- Zorg dat de doel-database bestaat en dat de tabellen al aangemaakt zijn of voeg code toe om ze aan te maken.
- Test het script eerst op een kleine dataset om fouten te voorkomen.
Heeft u verdere vragen of hulp nodig bij het aanpassen van het script?
provider: deepseek
model: deepseek-chat
Zeker! Hier is een Ruby-script dat de migratie automatiseert met foutafhandeling en logging:
```ruby
require 'mysql2'
require 'logger'
# Configuratie
BRON_DB = {
host: 'localhost',
username: 'gebruiker',
password: 'wachtwoord',
database: 'bron_db'
}
DOEL_DB = {
host: 'localhost',
username: 'gebruiker',
password: 'wachtwoord',
database: 'doel_db'
}
# Logging instellen
log = Logger.new('migratie.log')
log.level = Logger::INFO
log.datetime_format = '%Y-%m-%d %H:%M:%S'
# Tabellen en transformaties configuratie
TABELLEN_CONFIG = {
'gebruikers' => {
velden: ['id', 'naam', 'email', 'aangemaakt_op'],
transformaties: {
# Voorbeeld: email naar lowercase
'email' => ->(waarde) { waarde.downcase if waarde }
}
},
'bestellingen' => {
velden: ['id', 'gebruiker_id', 'bedrag', 'status', 'datum'],
transformaties: {
# Voorbeeld: status transformatie
'status' => ->(waarde) { waarde.nil? ? 'in_afwachting' : waarde }
}
}
# Voeg meer tabellen toe zoals nodig
}
def verbind_mysql(config)
Mysql2::Client.new(
host: config[:host],
username: config[:username],
password: config[:password],
database: config[:database],
reconnect: true
)
end
def migreer_tabel(bron_client, doel_client, tabel_naam, config, logger)
logger.info("Start migratie van tabel: #{tabel_naam}")
velden = config[:velden]
transformaties = config[:transformaties] || {}
# Controleer of tabel bestaat in bron
begin
bron_client.query("SELECT 1 FROM #{tabel_naam} LIMIT 1")
rescue Mysql2::Error => e
logger.error("Tabel #{tabel_naam} bestaat niet in bron database: #{e.message}")
return
end
# Bereid INSERT statement voor
placeholders = velden.map { '?' }.join(', ')
insert_sql = "INSERT INTO #{tabel_naam} (#{velden.join(', ')}) VALUES (#{placeholders})"
# Haal gegevens op en migreer
begin
resultaat = bron_client.query("SELECT #{velden.join(', ')} FROM #{tabel_naam}")
doel_client.query('START TRANSACTION')
resultaat.each do |rij|
# Pas transformaties toe
waarden = velden.map do |veld|
if transformaties[veld]
transformaties[veld].call(rij[veld])
else
rij[veld]
end
end
doel_client.prepare(insert_sql).execute(*waarden)
end
doel_client.query('COMMIT')
logger.info("Succesvol gemigreerd: #{resultaat.count} rijen naar #{tabel_naam}")
rescue Mysql2::Error => e
doel_client.query('ROLLBACK')
logger.error("Fout tijdens migratie van #{tabel_naam}: #{e.message}")
raise
end
end
begin
log.info("=== START MIGRATIE PROCES ===")
# Maak verbinding met databases
bron_client = verbind_mysql(BRON_DB)
doel_client = verbind_mysql(DOEL_DB)
log.info("Verbonden met bron database: #{BRON_DB[:database]}")
log.info("Verbonden met doel database: #{DOEL_DB[:database]}")
# Voer migratie uit voor elke tabel
TABELLEN_CONFIG.each do |tabel_naam, config|
migreer_tabel(bron_client, doel_client, tabel_naam, config, log)
end
log.info("=== MIGRATIE VOLTOOID ===")
rescue Mysql2::Error => e
log.fatal("Database fout: #{e.message}")
puts "Er is een database fout opgetreden. Zie migratie.log voor details."
rescue StandardError => e
log.fatal("Onverwachte fout: #{e.message}")
puts "Er is een onverwachte fout opgetreden. Zie migratie.log voor details."
ensure
bron_client&.close
doel_client&.close
log.info("Database verbindingen gesloten")
end
```
**Belangrijke aanpassingen die je moet maken:**
1. **Tabellen en velden aanpassen** in `TABELLEN_CONFIG`:
```ruby
TABELLEN_CONFIG = {
'jouw_tabel_naam' => {
velden: ['kolom1', 'kolom2', 'kolom3'], # Pas aan naar jouw velden
transformaties: {
# Voeg transformaties toe zoals nodig
'kolom_naam' => ->(waarde) { ... }
}
}
}
```
2. **Veelgebruikte transformaties**:
```ruby
transformaties: {
# Datum conversie
'datum' => ->(waarde) { waarde.strftime('%Y-%m-%d') if waarde },
# Waarde mapping
'status' => ->(waarde) {
case waarde
when 'actief' then 'active'
when 'inactief' then 'inactive'
else waarde
end
},
# Null handling
'telefoon' => ->(waarde) { waarde.nil? ? 'Onbekend' : waarde }
}
```
**Het script bevat:**
- ✅ **Foutafhandeling** met duidelijke logging
- ✅ **Transactionele verwerking** (alle wijzigingen of geen)
- ✅ **Gedetailleerde logging** naar `migratie.log`
- ✅ **Transformatiemogelijkheden** voor gegevens
- ✅ **Automatische verbindingsbeheer**
**Voor gebruik:**
1. Installeer de benodigde gem: `gem install mysql2`
2. Pas de database configuratie aan
3. Definieer je tabellen en transformaties in `TABELLEN_CONFIG`
4. Voer uit met: `ruby migratie_script.rb`
Het script logt alle activiteiten en fouten zowel naar het console als naar een logbestand voor eenvoudige tracking!

