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

Откуда: г.Иркутск
Сообщений: 4276
Добрый день.
Появилась задача выгружать данные из одной базы в другую, для этого пока сделал демку на тестовых БД.
Код такой:
+
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

Откуда:
Сообщений: 9501
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

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

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

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

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

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


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

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

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

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

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

Откуда:
Сообщений: 871
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

Откуда: г.Иркутск
Сообщений: 4276
Долбанутый прикол 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

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

Откуда: г.Иркутск
Сообщений: 4276
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
Сообщений: 1871
автор
А вообще нужно ли 100 раз подряд менять текст запроса, если он по сути не меняется,


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

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

Откуда: A galaxy far far away
Сообщений: 1871
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

Откуда:
Сообщений: 36325
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

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

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

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

Откуда:
Сообщений: 81
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

Откуда: г.Иркутск
Сообщений: 4276
Как выполнить такой запрос?
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

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

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

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

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

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