сценарий для преобразования дампа mysql sql файл в формат, который может быть импортирован в sqlite3 дб

Читая документацию, все, что я мог сделать, это правило:

https://mysite.test/* fbclid=:val1 https://mysite.test/:splat 301

, но оно не работает.

20
задан graup 14 January 2013 в 21:22
поделиться

4 ответа

Этот сценарий оболочки помогает Вам

#!/bin/sh
if [ "x$1" == "x" ]; then
   echo "Usage: $0 <dumpname>"
   exit
fi
cat $1 |
grep -v ' KEY "' |
grep -v ' UNIQUE KEY "' |
grep -v ' PRIMARY KEY ' |
sed '/^SET/d' |
sed 's/ unsigned / /g' |
sed 's/ auto_increment/ primary key autoincrement/g' |
sed 's/ smallint([0-9]*) / integer /g' |
sed 's/ tinyint([0-9]*) / integer /g' |
sed 's/ int([0-9]*) / integer /g' |
sed 's/ character set [^ ]* / /g' |
sed 's/ enum([^)]*) / varchar(255) /g' |
sed 's/ on update [^,]*//g' |
perl -e 'local $/;$_=<>;s/,\n\)/\n\)/gs;print "begin;\n";print;print "commit;\n"' |
perl -pe '
  if (/^(INSERT.+?)\(/) {
     $a=$1;
     s/\\'\''/'\'\''/g;
     s/\\n/\n/g;
     s/\),\(/\);\n$a\(/g;
  }
  ' > $1.sql
cat $1.sql | sqlite3 $1.db > $1.err
ERRORS=`cat $1.err | wc -l`
if [ $ERRORS == 0 ]; then
  echo "Conversion completed without error. Output file: $1.db"
  rm $1.sql
  rm $1.err
    rm tmp
else
   echo "There were errors during conversion.  Please review $1.err and $1.sql for details."
fi
23
ответ дан 29 November 2019 в 23:48
поделиться

Чтобы заставить приведенный выше сценарий работать, я внес следующие изменения:

  1. запустите его с помощью #! / Bin / bash
  2. добавьте два sed в список конвейерных sed:
    • sed 's / \\ r \\ n / \\ n / g'
    • sed 's / \\ "/" / g'
  3. строка 'rm tmp' не используется ( если у вас нет файла с именем 'tmp': O)
  4. моя команда mysqldump выглядела так:

    $ mysqldump -u usernmae -h host --compatible = ansi --skip-opt -p database_name> dump_file

Тогда все заработало ... спасибо за сценарий.

7
ответ дан 29 November 2019 в 23:48
поделиться

отлично работает на Centos 5.3 64bit. как только у вас есть выходной файл, загрузите его так:

shell> sqlite3 file_name.db SQLite версии 3.3.6 Введите ".help" для получения инструкций. sqlite>. базы данных seq имя файла


0 главный / текущий_каталог/ имя_файла.db
sqlite> выберите * из таблицы; . . . . . полученные результаты... sqlite> .quit

0
ответ дан 29 November 2019 в 23:48
поделиться

Когда база данных sqlite3 будет использоваться с ruby, вы можете изменить:

tinyint([0-9]*) 

на:

sed 's/ tinyint(1*) / boolean/g ' |
sed 's/ tinyint([0|2-9]*) / integer /g' |

увы, это работает только наполовину, потому что, хотя вы вставляете 1 и 0 в поле с пометкой boolean, sqlite3 хранит их как 1 и 0, так что вам нужно пройти и сделать что-то вроде:

Table.find(:all, :conditions => {:column => 1 }).each { |t| t.column = true }.each(&:save)
Table.find(:all, :conditions => {:column => 0 }).each { |t| t.column = false}.each(&:save)

но было полезно иметь sql-файл, чтобы посмотреть на него, чтобы найти все булевы.

1
ответ дан 29 November 2019 в 23:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: