Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Перенос данных из Firebird в MySQL  [new]
Gallemar
Member

Откуда: г.Иркутск
Сообщений: 4761
Добрый день.
Появилась задача выгружать данные из одной базы в другую, для этого пока сделал демку на тестовых БД.
Код такой:
+
procedure TForm1.Button1Click(Sender: TObject);
var
      fbdb: TpFIBDatabase;
      fbtrans : TpFIBTransaction;
      fbds:   TpFIBDataset;
      msdb:  TZConnection;
      msqr: TZQuery;
begin
    fbdb:=TpFIBDatabase.Create(nil);
     msdb:=TZConnection.Create(nil);
    fbdb.connectparams.Username:='SYSDBA';
    fbdb.connectparams.Password:='masterkey';
    fbdb.DatabaseName:='D:\FDBase\Test.FDB';
     fbdb.LibraryName:= 'fbclient.dll';
    msdb.librarylocation:='C:\Program Files (x86)\Borland\Delphi7\Projects\libmysql.dll';
    msdb.database:= 'test';
    msdb.hostname:= 'smt4.slata.com';
    msdb.password:= 'masterkey';
    msdb.port:=3306;
    msdb.protocol:='mysql-5';
    msdb.user:='sysdba';
    msdb.AutoCommit:=false;
    fbdb.Connected:= true;
    msdb.Connected:= true;
    fbtrans:= TpFIBTransaction.Create(nil);
    fbds:= TpFIBDataset.Create(nil);
    msqr:= TZQuery.Create(nil);
    msqr.Connection:=msdb;
    fbtrans.DefaultDatabase:=fbdb;
    fbds.Transaction:=fbtrans;
    fbds.SelectSQL.Clear;
    fbds.SelectSQL.Add('select ID, A1, A2, A3 from TABLE_1');
    fbtrans.StartTransaction;
    fbds.Open;
    fbds.first;
    memo1.Lines.Clear;
 while not fbds.EOF do begin
      memo1.Lines.add(fbds.FieldByRelName('ID').AsString + ' - '+ fbds.FieldByRelName('A1').AsString+ ' - '+ fbds.FieldByRelName('A2').AsString+' - '+ fbds.FieldByRelName('A3').AsString);
      msqr.SQL.Add('INSERT INTO table_1(ID,A1,A2,A3) VALUE (:ID,:A1,:A2,:A3)');
      msqr.ParamByName('ID').Value := fbds.FieldByRelName('ID').AsInteger;
      msqr.ParamByName('A1').Value := fbds.FieldByRelName('A1').AsInteger;
      msqr.ParamByName('A2').Value := fbds.FieldByRelName('A2').AsInteger;
      msqr.ParamByName('A3').Value := fbds.FieldByRelName('A3').AsInteger;
      msqr.ExecSQL;
      msdb.Commit;
      msqr.close;
      fbds.Next;
end;

    fbtrans.Commit;
    fbtrans.Free;
    fbds.Free;
end;


Доступ к базе:
Firebird - fib+, mysql - zeos, Delphi 7 классика.
при запуске получаю ошибку:

---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EZSQLException with message 'SQL Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INSERT INTO table_1(ID,A1,A2,A3) VALUE (3874,4088,3887,3163)' at line 1'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------

Что может быть?
2 окт 17, 11:31    [20835786]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных из Firebird в MySQL  [new]
Dmitry Arefiev
Member

Откуда:
Сообщений: 9558
Gallemar
msqr.SQL.Add('INSERT INTO table_1(ID,A1,A2,A3) VALUE (:ID,:A1,:A2,:A3)');

Начни с вынесения из цикла.
2 окт 17, 11:43    [20835833]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных из Firebird в MySQL  [new]
Gallemar
Member

Откуда: г.Иркутск
Сообщений: 4761
Dmitry Arefiev, Дмитрий, а как вообще правильно такие запросы выполнять?
2 окт 17, 11:50    [20835857]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных из Firebird в MySQL  [new]
Cobalt747
Member

Откуда:
Сообщений: 2008
Gallemar,
отказаться в циклах вообще от использования XXX.SQL.Add
2 окт 17, 11:59    [20835900]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных из Firebird в MySQL  [new]
alekcvp
Member

Откуда:
Сообщений: 968
Кстати, вопрос знатокам DB: стоит ли вообще в таких задачах делать Commit после каждой добавленной строчки или имеет смысл сначала все строки добавить, а потом оптом коммит? Ну или если их многамиллионов(тм) то, скажем, делать коммит после каждых 100к строк?
2 окт 17, 12:57    [20836086]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных из Firebird в MySQL  [new]
schi
Member

Откуда: Москва
Сообщений: 2483
В операторе INSERT INTO обычно используется слово VALUES, а не VALUE
2 окт 17, 13:02    [20836112]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных из Firebird в MySQL  [new]
schi
Member

Откуда: Москва
Сообщений: 2483
alekcvp
Кстати, вопрос знатокам DB: стоит ли вообще в таких задачах делать Commit после каждой добавленной строчки или имеет смысл сначала все строки добавить, а потом оптом коммит? Ну или если их многамиллионов(тм) то, скажем, делать коммит после каждых 100к строк?


Дао: commit надо делать, тогда, когда его надо делать, то есть, когда надо перевести базу из одного согласованного состояния в другое.
2 окт 17, 13:03    [20836120]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных из Firebird в MySQL  [new]
Dmitry Arefiev
Member

Откуда:
Сообщений: 9558
schi
Дао: commit надо делать, тогда, когда его надо делать, то есть, когда надо перевести базу из одного согласованного состояния в другое.

Мир не идеален ...
2 окт 17, 16:30    [20836816]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных из Firebird в MySQL  [new]
Gallemar
Member

Откуда: г.Иркутск
Сообщений: 4761
Cobalt747
Gallemar,
отказаться в циклах вообще от использования XXX.SQL.Add

А как тогда делать?
3 окт 17, 08:34    [20837872]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных из Firebird в MySQL  [new]
Граур Станислав
Member

Откуда:
Сообщений: 876
Gallemar
Cobalt747
Gallemar,
отказаться в циклах вообще от использования XXX.SQL.Add

А как тогда делать?


Скажи пожалуйста, если цикл будет исполнен 100 раз,
сколько операторов INSERT будет в msqr и зачем их там столько?

А вообще нужно ли 100 раз подряд менять текст запроса, если он по сути не меняется,
но при каждом его изменении автоматом дергается Prepare?

 
while not fbds.EOF do begin
[skip]
      msqr.SQL.Add('INSERT INTO table_1(ID,A1,A2,A3) VALUE (:ID,:A1,:A2,:A3)');
[skip]
      msqr.ExecSQL;
      msdb.Commit;
      msqr.close;
      fbds.Next;
end;
3 окт 17, 08:49    [20837898]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных из Firebird в MySQL  [new]
Gallemar
Member

Откуда: г.Иркутск
Сообщений: 4761
Долбанутый прикол Zeos:

msdb.AutoCommit:=false;
...
msdb.Commit;
msqr.close; //не коммитит

msdb.AutoCommit:=true;
...
msdb.Commit;
msqr.close;

{Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EZDatabaseError with message 'Invalid operation in AutoCommit mode'. Process stopped. Use Step or Run to continue.} 
3 окт 17, 09:18    [20837938]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных из Firebird в MySQL  [new]
Alexander A. Sak
Member

Откуда: Омск
Сообщений: 956
Крамольный вопрос. А зачем для этого писать на Delphi?
У FB есть isql, у mysql всяко должна быть своя утилита.
isql-ем генерим SQL-файл, в mysql его исполняем. Вызовы -- обычным BAT-файлом.
3 окт 17, 09:25    [20837954]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных из Firebird в MySQL  [new]
Gallemar
Member

Откуда: г.Иркутск
Сообщений: 4761
Alexander A. Sak
Крамольный вопрос. А зачем для этого писать на Delphi?
У FB есть isql, у mysql всяко должна быть своя утилита.
isql-ем генерим SQL-файл, в mysql его исполняем. Вызовы -- обычным BAT-файлом.

Это демка, просто для пробы. Процесс гораздо сложнее, на bat сделать можно, но я не мазохист.
3 окт 17, 09:35    [20837985]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных из Firebird в MySQL  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2612
автор
А вообще нужно ли 100 раз подряд менять текст запроса, если он по сути не меняется,


Осталось додумать один шаг до старой как мир оптимизации:
Всё, что не меняется в цикле можно и нужно выносить за цикл.
3 окт 17, 12:46    [20838654]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных из Firebird в MySQL  [new]
Gallemar
Member

Откуда: г.Иркутск
Сообщений: 4761
Мне казалось правильным выполнить 100500 запросов и потом один общий коммит на все.
3 окт 17, 13:50    [20838905]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных из Firebird в MySQL  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2612
Gallemar,

лучше делать коммиты через каждые 1000 записей.

https://stackoverflow.com/questions/12986774/run-multiple-insert-queries-against-firebird-database-using-isql

можно дополнительно погуглить 'bulk insert firebird'
3 окт 17, 14:13    [20839032]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных из Firebird в MySQL  [new]
miksoft
Member

Откуда:
Сообщений: 36800
Alexander A. Sak
Крамольный вопрос. А зачем для этого писать на Delphi?
У FB есть isql, у mysql всяко должна быть своя утилита.
isql-ем генерим SQL-файл, в mysql его исполняем. Вызовы -- обычным BAT-файлом.
+много
Только через csv/tsv. У MySQL есть утилита mysqlimport и команда LOAD DATA INFILE. Это самый быстрый способ загрузить данные в MySQL.
3 окт 17, 21:16    [20840222]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных из Firebird в MySQL  [new]
Валерий666
Member

Откуда:
Сообщений: 121
У меня сейчас тодже стоит порцесс миграции. Правда мне не надо решать эту задачу каждый день, мне понравилась программа MySQLStudio. Есть куча вариантов экспорта, соотношений и пр.
3 окт 17, 21:43    [20840278]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных из Firebird в MySQL  [new]
Gallemar
Member

Откуда: г.Иркутск
Сообщений: 4761
Валерий666
мне понравилась программа MySQLStudio. Есть куча вариантов экспорта, соотношений и пр.

От EMS?
4 окт 17, 05:55    [20840722]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных из Firebird в MySQL  [new]
hottabych31
Member

Откуда:
Сообщений: 94
FDQuery1.SQL.Text := 'insert into MyTab values (:p1, :p2, :p3)';
// here FDQuery1.Params collection is filled by 3 parameters
FDQuery1.Params.ArraySize := 100;
for i := 0 to 100-1 do begin
  FDQuery1.Params[0].AsIntegers[i] := i;
  FDQuery1.Params[1].AsStrings[i] := 'qwe';
  FDQuery1.Params[2].Clear(i);
end;

Правда, это в firedac
4 окт 17, 12:01    [20841565]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных из Firebird в MySQL  [new]
Gallemar
Member

Откуда: г.Иркутск
Сообщений: 4761
Как выполнить такой запрос?
INSERT INTO classif( id, owner, name, version, deleted) VALUES (3+'.18809.31741.31794.','.18809.31741.','Сладкие подарки ТМ Марс(М&М's Селебрейшн','1','0')


при выполнении получаю

Project Project1.exe raised exception class EZSQLException with message 'SQL Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 's Селебрейшн','1','0')' at line 1'. Process stopped. Use Step or Run to continue.

Как эту кавычку исключить?
9 окт 17, 10:57    [20853735]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных из Firebird в MySQL  [new]
Параметризатор
Guest
Gallemar,

Использовать параметры?
9 окт 17, 11:50    [20853965]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных из Firebird в MySQL  [new]
Gallemar
Member

Откуда: г.Иркутск
Сообщений: 4761
Можно пример?
9 окт 17, 12:07    [20854023]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных из Firebird в MySQL  [new]
Подкаблучнег
Member

Откуда: Из под каблука
Сообщений: 121
Gallemar
Как эту кавычку исключить?

QuotedStr?
9 окт 17, 12:08    [20854032]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данных из Firebird в MySQL  [new]
alekcvp
Member

Откуда:
Сообщений: 968
Gallemar
Можно пример?

Ровно тремя постами выше твоего сообщения пример.
9 окт 17, 12:27    [20854109]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить