sql >> Databasteknik >  >> RDS >> Mysql

Snabbt enkelt sätt att migrera SQLite3 till MySQL?

Alla verkar börja med några greps och perl-uttryck och du får typ något som fungerar för just din datauppsättning men du har ingen aning om det har importerats data korrekt eller inte. Jag är allvarligt förvånad över att ingen har byggt ett solidt bibliotek som kan konvertera mellan de två.

Här en lista över ALLA skillnader i SQL-syntax som jag känner till mellan de två filformaten:Raderna som börjar med:

  • BÖRJA TRANSAKTIONEN
  • ÅTGÄRDER
  • sqlite_sequence
  • SKAPA UNIKT INDEX

används inte i MySQL

  • SQLite använder CREATE TABLE/INSERT INTO "table_name" och MySQL använder CREATE TABLE/INSERT INTO table_name
  • MySQL använder inte citattecken i schemadefinitionen
  • MySQL använder enkla citattecken för strängar i INSERT INTO klausuler
  • SQLite och MySQL har olika sätt att undvika strängar inuti INSERT INTO klausuler
  • SQLite använder 't' och 'f' för booleans använder MySQL 1 och 0 (ett enkelt regex för detta kan misslyckas när du har en sträng som:'Jag gör det, du gör inte' i din INSERT INTO )
  • SQLLite använder AUTOINCREMENT , MySQL använder AUTO_INCREMENT

Här är ett mycket grundläggande hackat perl-skript som fungerar för min dataset och kontrollerar många fler av dessa tillstånd än andra perl-skript jag hittade på webben. Nu garanterar att det kommer att fungera för din data men ändra gärna och skicka tillbaka det här.

#! /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. SQL-servern som motsvarar GROUP_CONCAT()

  2. Använda String[] selectionArgs i SQLiteDatabase.query()

  3. När kan vi använda ett identifikationsnummer istället för dess namn i PostgreSQL?

  4. Använder RegEx i SQL Server