Update SQLite

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Update SQLite

Сообщение Kenwud » 08.12.2009 15:49:31

Не могу никак обновить записи в таблице SQLite?
SQLdb: SQLConnection + SQLQuery + SQLTransaction
100 тыс. записей. Поля: id, Поле1, Поле2.
Надо для каждой записи из поля "Поле2" вычислить и записать в "Поле1"

Я пробовал делать так:
Считал таблицу, и в цикле для каждой записи делаю так:
Код: Выделить всё
UPDATE Table1
SET Поле1="значение"
WHERE id="id"

но так ооочень долго :(

Может можно как-то так:
Код: Выделить всё
Query.SQL.Add('SELECT * FROM Table1');
Query.Open;
while not Query.Eof do begin
  Query.Edit;
  Query.FieldByName('Поле1').AsString:='....';
  Query.Post;
  Query.Next;
end;
Query.ApplyUpdates;

На это у меня выдает ошибку:
Код: Выделить всё
raised exception class 'EDatabaseError' with message:
Parameter type ftMemo not supported.


P.S. До этого у меня эта программка была в Delphi, а там есть TTable, с ним я доволно быстро пробегал по всем записям.
Kenwud
новенький
 
Сообщения: 15
Зарегистрирован: 31.10.2009 03:03:50

Re: Update SQLite

Сообщение and » 08.12.2009 21:02:18

А на стороне сервера никак нельзя сделать?
Код: Выделить всё
UPDATE Table1
  SET Поле1=выражение_с_Поле2
Аватара пользователя
and
постоялец
 
Сообщения: 124
Зарегистрирован: 16.09.2009 17:11:01
Откуда: г. Гомель, Беларусь

Re: Update SQLite

Сообщение Kenwud » 08.12.2009 22:03:26

and писал(а):А на стороне сервера никак нельзя сделать?

я думал об этом, я не знаю как :(
Надо из значений: w12, e233-2, t8977, t197-1 (к примеру) сделать такие: w000012, e000233-2, t008977, t000197-1
Есть программа чужая, которая правильно работает только с такими из-за сотривки :(
Kenwud
новенький
 
Сообщения: 15
Зарегистрирован: 31.10.2009 03:03:50

Re: Update SQLite

Сообщение Padre_Mortius » 09.12.2009 00:28:12

Какая версия sqlite у вас используется? Если sqlite3 то попробуйте использовать TSqlite3Dataset
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: Update SQLite

Сообщение Kenwud » 09.12.2009 02:43:17

Padre_Mortius писал(а):Какая версия sqlite у вас используется? Если sqlite3 то попробуйте использовать TSqlite3Dataset

Да, третья. А как его использовать? Может есть какой-нибудь маленький примерчик :oops:

Добавлено спустя 5 часов 2 минуты 43 секунды:
Что я не так делаю?
У компонента Sqlite3Dataset указал Базу, Таблицу и Активировал
Код: Выделить всё
Sqlite3Dataset.Edit;
Sqlite3Dataset.FieldByName('Поле').AsString := 'значение';
Sqlite3Dataset.Post;
Sqlite3Dataset.ApplyUpdates;

Не работает :cry:
Kenwud
новенький
 
Сообщения: 15
Зарегистрирован: 31.10.2009 03:03:50

Re: Update SQLite

Сообщение FedeX » 09.12.2009 12:03:08

А Sqlite3Dataset.Open; делали?

Насчёт сделать на стороне сервера вот пример можно попробовать (кто-то на форуме Лазаруса показывал):

Код: Выделить всё
uses sqlite3;
........................
procedure StrFTime(context: PSqlite3_Context; argc: LongInt; argv: PPSqlite3_Value); cdecl;
var
  Year, Month, Day: word;
  FormatStr: String;
begin
  if (sqlite3_value_type(argv[1]) <> SQLITE_INTEGER) and
    (sqlite3_value_type(argv[1]) <> SQLITE_FLOAT) then
  begin
    sqlite3_result_null(context);
    Exit;
  end;
  FormatStr := UpperCase(sqlite3_value_text(argv[0]));
  DecodeDate(sqlite3_value_double(argv[1]), Year, Month, Day);
  if FormatStr = '%Y' then
    sqlite3_result_cint(context, Year)
  else
    if FormatStr = '%M' then
      sqlite3_result_cint(context, Month)
    else
      if FormatStr = '%D' then
        sqlite3_result_cint(context, Day)
      else
        sqlite3_result_null(context);
end;
..........................
sqlite3_create_function(DataSet.SqliteHandle, 'strftime', 2, sqlite_any, nil, @strftime, nil, nil);
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Re: Update SQLite

Сообщение alexmai » 09.12.2009 14:14:35

Padre_Mortius писал(а):Какая версия sqlite у вас используется? Если sqlite3 то попробуйте использовать TSqlite3Dataset

Я что -то упустил, стоит 28 версия lazarus, но TSqlite3Dataset чего то не нашел , может не там ищу ?
alexmai
постоялец
 
Сообщения: 106
Зарегистрирован: 02.02.2009 14:58:42

Re: Update SQLite

Сообщение FedeX » 09.12.2009 14:43:56

\lazarus\components\sqlite
пакет по умолчанию не установлен
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Re: Update SQLite

Сообщение alexmai » 09.12.2009 14:51:13

Большой сэнкс, протупил я конечно, не ожидад его, TSqlite3Dataset увидеть на вкладке DataAccess, логичнее было бы видеть на вкладке SQLDB :(
alexmai
постоялец
 
Сообщения: 106
Зарегистрирован: 02.02.2009 14:58:42

Re: Update SQLite

Сообщение Kenwud » 09.12.2009 18:54:42

FedeX писал(а):А Sqlite3Dataset.Open; делали?

Да, делал. Точнее я выставил свойство Active = True в Инспекторе объектов, при этом данные считываются, но не записываются :evil: Уже все перепробовал, ерунда какая-то!

Уже даже ZTable поставил из Zeos и он тоже не записывает :cry: Ничего не понимаю, уж ZTable то должен работать, прям заговор какой-то. Что-то видать не так делаю :(
Код: Выделить всё
ZTable.Edit;
ZTable.FieldByName('Поле').AsString := ...;
ZTable.Post;
ZTable.ApplyUpdates;
ZTable.CommitUpdates;
Kenwud
новенький
 
Сообщения: 15
Зарегистрирован: 31.10.2009 03:03:50

Re: Update SQLite

Сообщение FedeX » 09.12.2009 19:52:55

A ID это точно примари кей? Он какого типа?
Попробуй явно указать в компоненте что это примари кей..
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Re: Update SQLite

Сообщение Kenwud » 09.12.2009 20:11:26

FedeX писал(а):A ID это точно примари кей? Он какого типа?

На сколько я понял тип поля в SQLite большого значиния не имеет.
Таблица была создана сделующим запросом SQL:
Код: Выделить всё
CREATE TABLE ИмяТаблицы (
id INTEGER  NOT NULL PRIMARY KEY AUTOINCREMENT,
...
)


FedeX писал(а):Попробуй явно указать в компоненте что это примари кей..

По моему пробовал указывать, сейчас проверю.

Добавлено спустя 2 часа 10 минут 27 секунд:
В программе SQLite Expert Professional можно писать скрипты на Pascal. В общем написал, работает, но по моему медленно :(
90 тыс. записей 10 минут обновляются это медленно?
Изображение
Kenwud
новенький
 
Сообщения: 15
Зарегистрирован: 31.10.2009 03:03:50

Re: Update SQLite

Сообщение alexmai » 10.12.2009 15:30:58

Query.SQL.Add('SELECT * FROM Table1');
Query.Open;

а может подправить запрос например:
SELECT ПОЛЕ1, ПОЛЕ2 FROM TABLE1 ?

А ЧТО ДЛЯ КАЖДОЙ ЗАПИСИ РАЗНЫЙ АЛГОРИТМ ПРЕОБРАЗОВАНИЯ ПОЛЯ В ПОЛЕ2 ?
alexmai
постоялец
 
Сообщения: 106
Зарегистрирован: 02.02.2009 14:58:42

Re: Update SQLite

Сообщение Kenwud » 11.12.2009 01:22:35

alexmai писал(а):
Query.SQL.Add('SELECT * FROM Table1');
Query.Open;

а может подправить запрос например:
SELECT ПОЛЕ1, ПОЛЕ2 FROM TABLE1 ?

Зачем? Запрос на выборку занимает несколько секунд. Проблема в изменении данных, как я понял изменить данные в SQLte можно только SQL запросом "UPDATE...SET...WHERE.."
Я наверное тут запутал уже всех :oops:
Я думал будет на много быстрее сделать выборку таблицы целиком, а затем обработать записи этого Dataset'а поочередно перебирая, а затем отправить целиком в базу, чем инструкция SQL для каждой записи будет искать по ключевому полю запись для изменения "UPDATE...SET...WHERE id=..."
alexmai писал(а):А ЧТОТО ДЛЯ КАЖДОЙ ЗАПИСИ РАЗНЫЙ АЛГОРИТМ ПРЕОБРАЗОВАНИЯ ПОЛЯ В ПОЛЕ2 ?

Нет, алгоритм один.

Мне в принципе не так важна скорость, раз в месяц надо делать данную операцию, могу и подождать 10 минут, просто очень хочется разобраться :)
Kenwud
новенький
 
Сообщения: 15
Зарегистрирован: 31.10.2009 03:03:50

Re: Update SQLite

Сообщение alexmai » 11.12.2009 10:44:30

Нет, алгоритм один.

Если алгоритм один зачем тогда в запросе WHERE ID=...
что мешает просто одним запросом
update set table1 set поле2=F(Поле2)

где F(Поле2) - выражение реализующее алгоритм

А указание полей в запросе
SELECT ПОЛЕ1, ПОЛЕ2 FROM TABLE1
для того чтобы
определить названия полей в резалтсэте из-за чего может не происходить update
alexmai
постоялец
 
Сообщения: 106
Зарегистрирован: 02.02.2009 14:58:42

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 46

Рейтинг@Mail.ru
cron