powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Перенос данных из Firebird в MySQL
25 сообщений из 43, страница 1 из 2
Перенос данных из Firebird в MySQL
    #39529284
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.
Появилась задача выгружать данные из одной базы в другую, для этого пока сделал демку на тестовых БД.
Код такой:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
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
---------------------------

Что может быть?
...
Рейтинг: 0 / 0
Перенос данных из Firebird в MySQL
    #39529292
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar
Код: pascal
1.
msqr.SQL.Add('INSERT INTO table_1(ID,A1,A2,A3) VALUE (:ID,:A1,:A2,:A3)');


Начни с вынесения из цикла.
...
Рейтинг: 0 / 0
Перенос данных из Firebird в MySQL
    #39529299
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry Arefiev, Дмитрий, а как вообще правильно такие запросы выполнять?
...
Рейтинг: 0 / 0
Перенос данных из Firebird в MySQL
    #39529308
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,
отказаться в циклах вообще от использования XXX. SQL.Add
...
Рейтинг: 0 / 0
Перенос данных из Firebird в MySQL
    #39529349
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, вопрос знатокам DB: стоит ли вообще в таких задачах делать Commit после каждой добавленной строчки или имеет смысл сначала все строки добавить, а потом оптом коммит? Ну или если их многамиллионов(тм) то, скажем, делать коммит после каждых 100к строк?
...
Рейтинг: 0 / 0
Перенос данных из Firebird в MySQL
    #39529354
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В операторе INSERT INTO обычно используется слово VALUES, а не VALUE
...
Рейтинг: 0 / 0
Перенос данных из Firebird в MySQL
    #39529356
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpКстати, вопрос знатокам DB: стоит ли вообще в таких задачах делать Commit после каждой добавленной строчки или имеет смысл сначала все строки добавить, а потом оптом коммит? Ну или если их многамиллионов(тм) то, скажем, делать коммит после каждых 100к строк?

Дао: commit надо делать, тогда, когда его надо делать, то есть, когда надо перевести базу из одного согласованного состояния в другое.
...
Рейтинг: 0 / 0
Перенос данных из Firebird в MySQL
    #39529522
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiДао: commit надо делать, тогда, когда его надо делать, то есть, когда надо перевести базу из одного согласованного состояния в другое.
Мир не идеален ...
...
Рейтинг: 0 / 0
Перенос данных из Firebird в MySQL
    #39529793
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cobalt747Gallemar,
отказаться в циклах вообще от использования XXX. SQL.Add
А как тогда делать?
...
Рейтинг: 0 / 0
Перенос данных из Firebird в MySQL
    #39529797
Граур Станислав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GallemarCobalt747Gallemar,
отказаться в циклах вообще от использования XXX. SQL.Add
А как тогда делать?

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

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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 
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;
...
Рейтинг: 0 / 0
Перенос данных из Firebird в MySQL
    #39529814
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Долбанутый прикол Zeos:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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.} 
...
Рейтинг: 0 / 0
Перенос данных из Firebird в MySQL
    #39529817
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Крамольный вопрос. А зачем для этого писать на Delphi?
У FB есть isql, у mysql всяко должна быть своя утилита.
isql-ем генерим SQL-файл, в mysql его исполняем. Вызовы -- обычным BAT-файлом.
...
Рейтинг: 0 / 0
Перенос данных из Firebird в MySQL
    #39529829
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander A. SakКрамольный вопрос. А зачем для этого писать на Delphi?
У FB есть isql, у mysql всяко должна быть своя утилита.
isql-ем генерим SQL-файл, в mysql его исполняем. Вызовы -- обычным BAT-файлом.
Это демка, просто для пробы. Процесс гораздо сложнее, на bat сделать можно, но я не мазохист.
...
Рейтинг: 0 / 0
Перенос данных из Firebird в MySQL
    #39530099
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА вообще нужно ли 100 раз подряд менять текст запроса, если он по сути не меняется,

Осталось додумать один шаг до старой как мир оптимизации:
Всё, что не меняется в цикле можно и нужно выносить за цикл.
...
Рейтинг: 0 / 0
Перенос данных из Firebird в MySQL
    #39530138
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне казалось правильным выполнить 100500 запросов и потом один общий коммит на все.
...
Рейтинг: 0 / 0
Перенос данных из Firebird в MySQL
    #39530162
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,

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

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

можно дополнительно погуглить 'bulk insert firebird'
...
Рейтинг: 0 / 0
Перенос данных из Firebird в MySQL
    #39530498
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander A. SakКрамольный вопрос. А зачем для этого писать на Delphi?
У FB есть isql, у mysql всяко должна быть своя утилита.
isql-ем генерим SQL-файл, в mysql его исполняем. Вызовы -- обычным BAT-файлом.+много
Только через csv/tsv. У MySQL есть утилита mysqlimport и команда LOAD DATA INFILE. Это самый быстрый способ загрузить данные в MySQL.
...
Рейтинг: 0 / 0
Перенос данных из Firebird в MySQL
    #39530505
Валерий666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня сейчас тодже стоит порцесс миграции. Правда мне не надо решать эту задачу каждый день, мне понравилась программа MySQLStudio. Есть куча вариантов экспорта, соотношений и пр.
...
Рейтинг: 0 / 0
Перенос данных из Firebird в MySQL
    #39530554
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валерий666 мне понравилась программа MySQLStudio. Есть куча вариантов экспорта, соотношений и пр.
От EMS?
...
Рейтинг: 0 / 0
Перенос данных из Firebird в MySQL
    #39530664
hottabych31
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
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
...
Рейтинг: 0 / 0
Перенос данных из Firebird в MySQL
    #39533265
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как выполнить такой запрос?
Код: sql
1.
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.

Как эту кавычку исключить?
...
Рейтинг: 0 / 0
Перенос данных из Firebird в MySQL
    #39533302
Gallemar,

Использовать параметры?
...
Рейтинг: 0 / 0
Перенос данных из Firebird в MySQL
    #39533318
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно пример?
...
Рейтинг: 0 / 0
Перенос данных из Firebird в MySQL
    #39533322
Фотография Подкаблучнег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GallemarКак эту кавычку исключить?
QuotedStr?
...
Рейтинг: 0 / 0
Перенос данных из Firebird в MySQL
    #39533341
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GallemarМожно пример?
Ровно тремя постами выше твоего сообщения пример.
...
Рейтинг: 0 / 0
25 сообщений из 43, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Перенос данных из Firebird в MySQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]