Adakah yang tahu cara cepat dan mudah untuk memigrasi basis data SQLite3 ke MySQL?
Berikut adalah daftar konverter (tidak diperbarui sejak 2011):
yaitu Anda bisa melakukan ini:
Semua orang tampaknya memulai dengan beberapa greps dan ekspresi perl dan Anda agak mendapatkan sesuatu yang berfungsi untuk dataset khusus Anda, tetapi Anda tidak tahu apakah itu mengimpor data dengan benar atau tidak. Saya sangat terkejut tidak ada yang membangun perpustakaan yang solid yang dapat mengkonversi antara keduanya.
Berikut daftar SEMUA perbedaan dalam sintaks SQL yang saya ketahui tentang antara dua format file: Baris dimulai dengan:
tidak digunakan di MySQL
CREATE TABLE/INSERT INTO "table_name"
dan penggunaan MySQLCREATE TABLE/INSERT INTO table_name
INSERT INTO
klausaINSERT INTO
klausa't'
dan 'f'
untuk boolean, penggunaan MySQL 1
dan 0
(regex sederhana untuk ini dapat gagal ketika Anda memiliki string seperti: 'Saya lakukan, Anda tidak' di dalam Anda INSERT INTO
)AUTOINCREMENT
, menggunakan MySQLAUTO_INCREMENT
Berikut ini adalah skrip perl yang diretas yang sangat dasar yang berfungsi untuk dataset saya dan memeriksa lebih banyak kondisi ini yang ditemukan oleh skrip perl lainnya di web. Nu menjamin bahwa itu akan berfungsi untuk data Anda tetapi jangan ragu untuk memodifikasi dan memposting kembali di sini.
#! /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;
}
}
&& ($line !~ /CREATE UNIQUE INDEX/)
menambahkan&& ($line !~ /PRAGMA foreign_keys=OFF/)
* tabel-nama-pencocokan regex meleset angka, yang bukannya$line =~ /INSERT INTO \"([a-z_]*)\"(.*)/
harus ada$line =~ /INSERT INTO \"([a-z_1-9]*)\"(.*)/
Semoga ini membantu masa depan pembacaBerikut ini adalah skrip python, yang dibangun dari jawaban Shalman dan beberapa bantuan dari Alex martelli di Penerjemahan Perl ke Python
Saya membuatnya menjadi komunitas wiki, jadi silakan mengedit, dan refactor selama itu tidak merusak fungsionalitasnya (untungnya kami hanya dapat memutar kembali) - Cukup jelek tapi berfungsi
gunakan seperti itu (dengan asumsi skrip disebut
dump_for_mysql.py
:Yang kemudian dapat Anda impor ke mysql
catatan - Anda perlu menambahkan batasan kunci asing secara manual karena sqlite sebenarnya tidak mendukungnya
ini skripnya:
sumber
schema_migrations
(version
varchar (255) BUKAN NULL); INSERT INTO schema_migrations VALUES (20100714032840
); INSERT INTO schema_migrations VALUES ('20100714033251'); __Blobvar
tipe data, kutu kembali dalam pernyataan CREATE ...Mungkin cara termudah dan cepat adalah menggunakan perintah sqlite .dump, dalam hal ini membuat dump dari database sampel.
Anda kemudian dapat (secara teori) mengimpor ini ke dalam database mysql, dalam hal ini database pengujian pada server database 127.0.0.1, menggunakan root pengguna.
Saya katakan dalam teori karena ada beberapa perbedaan antara tata bahasa.
Dalam transaksi sqlite dimulai
MySQL hanya menggunakan
Ada masalah serupa lainnya (varchars dan tanda kutip ganda muncul kembali dalam pikiran) tetapi tidak ada yang menemukan dan mengganti tidak dapat memperbaiki.
Mungkin Anda harus bertanya mengapa Anda bermigrasi, jika kinerja / ukuran basis data masalahnya mungkin melihat reoginising skema, jika sistem pindah ke produk yang lebih kuat ini mungkin waktu yang ideal untuk merencanakan masa depan data Anda.
sumber
Jika Anda menggunakan Python / Django, ini cukup mudah:
buat dua basis data di settings.py (seperti di sini https://docs.djangoproject.com/en/1.11/topics/db/multi-db/ )
maka lakukan saja seperti ini:
sumber
sumber
Saya biasanya menggunakan fitur tabel Ekspor / impor IntelliJ DataGrip .
Anda dapat melihat kemajuan di sudut kanan bawah.
[ ]
sumber
Saya baru saja melalui proses ini, dan ada banyak bantuan dan informasi yang sangat baik dalam T / A ini, tetapi saya menemukan saya harus mengumpulkan berbagai elemen (ditambah beberapa dari T / As lain) untuk mendapatkan solusi yang berfungsi dalam untuk berhasil bermigrasi.
Namun, bahkan setelah menggabungkan jawaban yang ada, saya menemukan bahwa skrip Python tidak sepenuhnya berfungsi untuk saya karena tidak berfungsi di mana ada beberapa kejadian boolean di INSERT. Lihat di sini mengapa begitu.
Jadi, saya pikir saya akan memposting jawaban gabungan saya di sini. Penghargaan diberikan kepada mereka yang telah berkontribusi di tempat lain, tentunya. Tetapi saya ingin memberikan sesuatu kembali, dan menghemat waktu orang lain yang mengikuti.
Saya akan memposting skrip di bawah ini. Tapi pertama-tama, inilah instruksi untuk konversi ...
Saya menjalankan skrip pada OS X 10.7.5 Lion. Python bekerja di luar kotak.
Untuk menghasilkan file input MySQL dari database SQLite3 yang ada, jalankan skrip pada file Anda sendiri sebagai berikut,
Saya kemudian menyalin file dumped_sql.sql yang dihasilkan ke kotak Linux yang menjalankan Ubuntu 10.04.4 LTS di mana database MySQL saya berada.
Masalah lain yang saya miliki ketika mengimpor file MySQL adalah bahwa beberapa karakter unicode UTF-8 (khususnya tanda kutip tunggal) tidak diimpor dengan benar, jadi saya harus menambahkan saklar ke perintah untuk menentukan UTF-8.
Perintah yang dihasilkan untuk memasukkan data ke dalam database MySQL kosong yang baru adalah sebagai berikut:
Biarkan itu dimasak, dan itu sudah seharusnya! Jangan lupa meneliti data Anda, sebelum dan sesudah.
Jadi, seperti yang diminta OP, cepat dan mudah, ketika Anda tahu caranya! :-)
Selain itu, satu hal yang saya tidak yakin sebelum saya melihat ke migrasi ini, adalah apakah nilai field create_at dan updated_at akan dipertahankan - kabar baiknya bagi saya adalah, jadi saya bisa memigrasikan data produksi saya yang ada.
Semoga berhasil!
MEMPERBARUI
Sejak beralih ini, saya telah memperhatikan masalah yang tidak pernah saya perhatikan sebelumnya. Dalam aplikasi Rails saya, bidang teks saya didefinisikan sebagai 'string', dan ini berlanjut ke skema basis data. Proses yang diuraikan di sini menghasilkan ini yang didefinisikan sebagai VARCHAR (255) dalam database MySQL. Ini menempatkan batas 255 karakter pada ukuran bidang ini - dan apa pun di luar ini diam-diam terpotong selama impor. Untuk mendukung panjang teks lebih besar dari 255, skema MySQL perlu menggunakan 'TEXT' daripada VARCHAR (255), saya percaya. Proses yang ditentukan di sini tidak termasuk konversi ini.
Berikut skrip Python yang digabungkan dan direvisi yang berfungsi untuk data saya:
sumber
Baru-baru ini saya harus bermigrasi dari MySQL ke JavaDB untuk proyek yang sedang dikerjakan oleh tim kami. Saya menemukan perpustakaan Java yang ditulis oleh Apache bernama DdlUtils yang membuatnya sangat mudah. Ini menyediakan API yang memungkinkan Anda melakukan hal berikut:
Alat yang kami akhirnya tidak sepenuhnya otomatis, tetapi mereka bekerja dengan cukup baik. Bahkan jika aplikasi Anda tidak di Jawa, seharusnya tidak terlalu sulit untuk menyiapkan beberapa alat kecil untuk melakukan migrasi satu kali. Saya pikir saya dapat menarik migrasi kami dengan kurang dari 150 baris kode.
sumber
Tidak perlu skrip, perintah, dll ...
Anda hanya perlu mengekspor database sqlite Anda sebagai
.csv
file dan kemudian mengimpornya di Mysql menggunakan phpmyadmin.Saya menggunakannya dan itu bekerja luar biasa ...
sumber
Berdasarkan solusi Jims: Cara cepat dan mudah untuk memigrasi SQLite3 ke MySQL?
Ini bekerja untuk saya. Saya menggunakan sed hanya untuk membuang baris pertama, yang tidak seperti mysql, tetapi Anda mungkin juga memodifikasi skrip dump.py untuk membuang baris ini.
sumber
Dapatkan dump SQL
Impor dump ke MySQL
Untuk impor kecil:
atau
Ini akan meminta Anda untuk kata sandi. Harap dicatat: Jika Anda ingin memasukkan kata sandi secara langsung, Anda harus melakukannya TANPA spasi, langsung setelah
-p
:Untuk kesedihan yang lebih besar:
mysqlimport atau alat impor lainnya seperti BigDump .
BigDump memberi Anda bilah kemajuan:
sumber
Ha ... Kuharap aku menemukan ini dulu! Tanggapan saya terhadap posting ini ... skrip untuk mengkonversi file sql dump sql ke dalam format yang dapat diimpor ke sqlite3 db
Menggabungkan keduanya akan persis seperti yang saya butuhkan:
Ketika database sqlite3 akan digunakan dengan ruby, Anda mungkin ingin mengubah:
untuk:
sayangnya, ini hanya berfungsi karena meskipun Anda memasukkan angka 1 dan 0 ke dalam bidang bertanda boolean, sqlite3 menyimpannya sebagai angka 1 dan 0 sehingga Anda harus melalui dan melakukan sesuatu seperti:
tetapi itu membantu untuk memiliki file sql untuk melihat untuk menemukan semua booleans.
sumber
Saya menulis skrip sederhana ini dalam Python3. Ini dapat digunakan sebagai kelas yang disertakan atau skrip mandiri yang dipanggil melalui terminal shell. Secara default mengimpor semua bilangan bulat sebagai
int(11)
dan string sebagaivarchar(300)
, tetapi semua itu dapat disesuaikan dalam argumen konstruktor atau skrip masing-masing.CATATAN: Ini membutuhkan Connector MySQL / Python 2.0.4 atau lebih tinggi
Berikut tautan ke sumber di GitHub jika Anda menemukan kode di bawah ini sulit dibaca: https://github.com/techouse/sqlite3-to-mysql
sumber
Skrip ini ok kecuali untuk kasus ini yang tentu saja, saya sudah bertemu:
Script harus memberikan output ini:
Tetapi sebaliknya memberikan hasil itu:
dengan beberapa karakter non-ascii yang aneh di sekitar 0 dan 1 terakhir.
Ini tidak muncul lagi ketika saya mengomentari baris kode berikut (43-46) tetapi masalah lain muncul:
Ini hanya kasus khusus, ketika kami ingin menambahkan nilai menjadi 'f' atau 't' tetapi saya tidak terlalu nyaman dengan ekspresi reguler, saya hanya ingin melihat kasus ini untuk dikoreksi oleh seseorang.
Pokoknya terima kasih banyak untuk skrip yang berguna !!!
sumber
Solusi sederhana ini berhasil untuk saya:
sumber
perhatikan pernyataan BUAT
sumber