Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Перенос данных из Firebird в MySQL / 25 сообщений из 43, страница 1 из 2
02.10.2017, 11:31:15
    #39529284
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных из Firebird в MySQL
Добрый день.
Появилась задача выгружать данные из одной базы в другую, для этого пока сделал демку на тестовых БД.
Код такой:
Код: 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
02.10.2017, 11:43:39
    #39529292
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных из Firebird в MySQL
Gallemar
Код: pascal
1.
msqr.SQL.Add('INSERT INTO table_1(ID,A1,A2,A3) VALUE (:ID,:A1,:A2,:A3)');


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

Дао: commit надо делать, тогда, когда его надо делать, то есть, когда надо перевести базу из одного согласованного состояния в другое.
...
Рейтинг: 0 / 0
02.10.2017, 16:30:37
    #39529522
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных из Firebird в MySQL
schiДао: commit надо делать, тогда, когда его надо делать, то есть, когда надо перевести базу из одного согласованного состояния в другое.
Мир не идеален ...
...
Рейтинг: 0 / 0
03.10.2017, 08:34:31
    #39529793
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных из Firebird в MySQL
Cobalt747Gallemar,
отказаться в циклах вообще от использования XXX. SQL.Add
А как тогда делать?
...
Рейтинг: 0 / 0
03.10.2017, 08:49:30
    #39529797
Граур Станислав
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных из Firebird в MySQL
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
03.10.2017, 09:18:40
    #39529814
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных из Firebird в MySQL
Долбанутый прикол 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
03.10.2017, 09:25:03
    #39529817
Alexander A. Sak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных из Firebird в MySQL
Крамольный вопрос. А зачем для этого писать на Delphi?
У FB есть isql, у mysql всяко должна быть своя утилита.
isql-ем генерим SQL-файл, в mysql его исполняем. Вызовы -- обычным BAT-файлом.
...
Рейтинг: 0 / 0
03.10.2017, 09:35:07
    #39529829
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных из Firebird в MySQL
Alexander A. SakКрамольный вопрос. А зачем для этого писать на Delphi?
У FB есть isql, у mysql всяко должна быть своя утилита.
isql-ем генерим SQL-файл, в mysql его исполняем. Вызовы -- обычным BAT-файлом.
Это демка, просто для пробы. Процесс гораздо сложнее, на bat сделать можно, но я не мазохист.
...
Рейтинг: 0 / 0
03.10.2017, 12:46:35
    #39530099
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных из Firebird в MySQL
авторА вообще нужно ли 100 раз подряд менять текст запроса, если он по сути не меняется,

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

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

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

можно дополнительно погуглить 'bulk insert firebird'
...
Рейтинг: 0 / 0
03.10.2017, 21:16:36
    #39530498
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных из Firebird в MySQL
Alexander A. SakКрамольный вопрос. А зачем для этого писать на Delphi?
У FB есть isql, у mysql всяко должна быть своя утилита.
isql-ем генерим SQL-файл, в mysql его исполняем. Вызовы -- обычным BAT-файлом.+много
Только через csv/tsv. У MySQL есть утилита mysqlimport и команда LOAD DATA INFILE. Это самый быстрый способ загрузить данные в MySQL.
...
Рейтинг: 0 / 0
03.10.2017, 21:43:48
    #39530505
Валерий666
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных из Firebird в MySQL
У меня сейчас тодже стоит порцесс миграции. Правда мне не надо решать эту задачу каждый день, мне понравилась программа MySQLStudio. Есть куча вариантов экспорта, соотношений и пр.
...
Рейтинг: 0 / 0
04.10.2017, 05:55:59
    #39530554
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных из Firebird в MySQL
Валерий666 мне понравилась программа MySQLStudio. Есть куча вариантов экспорта, соотношений и пр.
От EMS?
...
Рейтинг: 0 / 0
04.10.2017, 12:01:33
    #39530664
hottabych31
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных из Firebird в MySQL
Код: 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
09.10.2017, 10:57:56
    #39533265
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных из Firebird в MySQL
Как выполнить такой запрос?
Код: 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
09.10.2017, 11:50:41
    #39533302
Перенос данных из Firebird в MySQL
Gallemar,

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


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