sql >> Database >  >> RDS >> Mysql

Snelle gemakkelijke manier om SQLite3 naar MySQL te migreren?

Iedereen lijkt te beginnen met een paar grep- en perl-expressies en je krijgt min of meer iets dat werkt voor jouw specifieke dataset, maar je hebt geen idee of het de gegevens correct heeft geïmporteerd of niet. Het verbaast me serieus dat niemand een solide bibliotheek heeft gebouwd die tussen de twee kan converteren.

Hier een lijst met ALLE verschillen in SQL-syntaxis die ik ken tussen de twee bestandsindelingen:De regels die beginnen met:

  • BEGIN TRANSACTIE
  • COMMIT
  • sqlite_sequence
  • EEN UNIEKE INDEX MAKEN

worden niet gebruikt in MySQL

  • SQLite gebruikt CREATE TABLE/INSERT INTO "table_name" en MySQL gebruikt CREATE TABLE/INSERT INTO table_name
  • MySQL gebruikt geen aanhalingstekens binnen de schemadefinitie
  • MySQL gebruikt enkele aanhalingstekens voor strings binnen de INSERT INTO clausules
  • SQLite en MySQL hebben verschillende manieren om te ontsnappen aan strings binnen INSERT INTO clausules
  • SQLite gebruikt 't' en 'f' voor booleans gebruikt MySQL 1 en 0 (een eenvoudige regex hiervoor kan mislukken als je een string hebt zoals:'I do, you don't' in je INSERT INTO )
  • SQLLite gebruikt AUTOINCREMENT , MySQL gebruikt AUTO_INCREMENT

Hier is een heel eenvoudig gehackt perl-script dat werkt voor mijn dataset en controleert op veel meer van deze voorwaarden dan andere perl-scripts die ik op internet vond. Nu garandeert dat het voor je gegevens werkt, maar voel je vrij om het aan te passen en hier terug te posten.

#! /usr/bin/perl

while ($line = <>){
    if (($line !~  /BEGIN TRANSACTION/) && ($line !~ /COMMIT/) && ($line !~ /sqlite_sequence/) && ($line !~ /CREATE UNIQUE INDEX/)){
        
        if ($line =~ /CREATE TABLE \"([a-z_]*)\"(.*)/i){
            $name = $1;
            $sub = $2;
            $sub =~ s/\"//g;
            $line = "DROP TABLE IF EXISTS $name;\nCREATE TABLE IF NOT EXISTS $name$sub\n";
        }
        elsif ($line =~ /INSERT INTO \"([a-z_]*)\"(.*)/i){
            $line = "INSERT INTO $1$2\n";
            $line =~ s/\"/\\\"/g;
            $line =~ s/\"/\'/g;
        }else{
            $line =~ s/\'\'/\\\'/g;
        }
        $line =~ s/([^\\'])\'t\'(.)/$1THIS_IS_TRUE$2/g;
        $line =~ s/THIS_IS_TRUE/1/g;
        $line =~ s/([^\\'])\'f\'(.)/$1THIS_IS_FALSE$2/g;
        $line =~ s/THIS_IS_FALSE/0/g;
        $line =~ s/AUTOINCREMENT/AUTO_INCREMENT/g;
        print $line;
    }
}


  1. customer.pk_name samenvoegen met transacties.fk_name vs. klant.pk_id [serienummer] samenvoegen met transacties.fk_id [geheel getal]

  2. SQLite-tabel maken

  3. Hoe de MySQL-versie te bepalen

  4. Bereken procenten van SUM() in dezelfde SELECT sql-query