[решено] Отсутствует ID, SQLQuery как сохранять?

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

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

Re: Отсутствует ID как SQLQuery.ApplyUpdates как сохранять?

Сообщение resident » 24.02.2016 17:57:22

vitaly_l писал(а):Не слушайте

Кхе, предлагаете не слушать человека с опытом 8+, а слушать вас. Причем вы даже абзац статьи в 10 строчек не может перевести.
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Отсутствует ID как SQLQuery.ApplyUpdates как сохранять?

Сообщение vitaly_l » 24.02.2016 18:18:54

resident писал(а):Кхе, предлагаете не слушать человека с опытом 8+, а слушать вас. Причем вы даже абзац статьи в 10 строчек не может перевести.

А что я разве ошибся при переводе?
Или при autocommit данные отправляются не ApplyUpdates (или идентичной) функцией?
Или нужно всегда писать SQL запросы ручками?

И почему Вы верите не разработчикам, а пользователю с опытом 8+?
Возраст, размер мускулатуры, авторитет, рост, длинна волос, крашенные ногти и вес в программировании значения не имеют.

Рано или поздно придёт, тот, кто решит или знает ответ и на мою задачу.
Снег Север - хороший и опытный программист, но он не конечная инстанция.
Разработчики Лазарус зачем эти функции сделали? Они все ошиблись?
Снег Север, разве Вам доказал или привёл пример сбоя?


Добавлено спустя 22 минуты 22 секунды:
Ну вот, пожалуйста, нашёл:
UsePrimaryKeyAsKey
ProviderFlags
согласно описанию должны решить задачу, т.к. меняют принцип индексации TSQLQuery.
Правда ещё не попробовал, но суть понятна. Короче Лазарус тоже умеет.


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Отсутствует ID как SQLQuery.ApplyUpdates как сохранять?

Сообщение resident » 24.02.2016 19:33:17

vitaly_l писал(а):А что я разве ошибся при переводе?

vitaly_l писал(а): Там, если я правильно перевёл, предлагается при отсутствии авто-индекса его сделать и только потом делать запрос к базе, если нужно её обрабатывать.

Перевод пункта 2 где?
have a set of fields that uniquely determine the record. Normally, they should be part of a unique index. This is not required, but will speed up the queries quite a lot

Таблица может и не иметь первичного ключа, но может иметь набор полей, уникальный для записи. И по нормальному эти поля должны входить в уникальный ключ.

з.ы. Ну а далее вы уже сейчас сами нашли - нужно указать, какие же это поля.

vitaly_l писал(а):И почему Вы верите не разработчикам, а пользователю с опытом 8+?

А с чего вы взяли, что я ему верю? :)

vitaly_l писал(а):Разработчики Лазарус зачем эти функции сделали?

Разработчики Лазарус - ворьё! Это все скопировано с Delphi от и до. Я сейчас изучаю базы данных по Delphi книгам и я еще не встретил в базах данных ничего, что было бы от "разработчиков Лазарус". Максимум на что они сподобились - переименование, например, ClientDataSet. И меня черт побери это устраивает и ни к кому вопросов нет - ни к Борланду ни к "разработчикам Лазаруса". Нахаляву ж среда разработки досталась. :mrgreen:
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Отсутствует ID как SQLQuery.ApplyUpdates как сохранять?

Сообщение Снег Север » 24.02.2016 19:37:59

resident писал(а):Как это не использовать?

Похоже, мы о разном говорим. Я с MySQL работаю из Делфи и с ENGINE MyISAM. Там нет понятия транзакций и, соответственно, все вставки/изменения применяются сразу. Я имел ввиду не использовать update/insert sql в том же компоненте TQuery, который выполняет select.

Добавлено спустя 6 минут 30 секунд:
resident писал(а):Таблица может и не иметь первичного ключа, но может иметь набор полей, уникальный для записи. И по нормальному эти поля должны входить в уникальный ключ.

Совершенно верно. У нас, в коммерческих разработках, таблицы имеют много ключей. Как, правило, всегда один автоинкрементный, а остальные - для ускорение выборок из таблиц, где могут быть миллионы записей.
Таблицы без автоинкрементного ключа используем только для временного хранения немногих записей, такие таблицы постоянно очищаются полностью. Там в роли уникального ключа выступает сочетание данных нескольких полей.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3053
Зарегистрирован: 27.11.2007 16:14:47

Re: Отсутствует ID как SQLQuery.ApplyUpdates как сохранять?

Сообщение vitaly_l » 24.02.2016 20:24:40

Снег Север писал(а):Таблицы без автоинкрементного ключа используем только для временного хранения немногих записей, такие таблицы постоянно очищаются полностью. Там в роли уникального ключа выступает сочетание данных нескольких полей.

Именно про такие я и говорил. Но судя по Вашему ответу Вы просто никогда их не перезаписывали и поэтому почему-то стали утверждать, что это вообще невозможно. Если бы я Вас послушал, то остался бы без верной информации. Если точно не знаете или не уверены, то лучше ПОЖАЛУЙСТА не втюхивайте лапшу, т.к. Вы могли нарушить: не только мои знания, но и ещё 10 000 программистов, которые читают форум. И все бы думали что "это" невозможно.

resident писал(а):Таблица может и не иметь первичного ключа, но может иметь набор полей, уникальный для записи. И по нормальному эти поля должны входить в уникальный ключ.

Вот только примера нет, как эти поля ей задать... там ведь несколько нужно. Через запятую? В кавычках? В квадратных скобках?

В общем ладно, пойду попробую, заодно тригеры прикручу, если всё заработает, то тему можно закрывать.

ВСЕМ - БОЛЬШОЕ СПАСИБО!

.

Добавлено спустя 1 час 11 минут 11 секунд:
resident писал(а):Разработчики Лазарус - ворьё! Это все скопировано с Delphi от и до. Я сейчас изучаю базы данных по Delphi книгам и я еще не встретил в базах данных ничего, что было бы от "разработчиков Лазарус".

MySQL - не разработчики Дельфи придумывали, мне так кажется. Соответственно MySQL - это не собственность Делфи. Лазарус, имеет цель быть совместимым с Делфи, но, он даже не копия, хотя многое совпадает по названиям. И код, по любому писали своими руками, т.к. иерархия, организация структуры и принцип работы разный.



.

Добавлено спустя 2 час 22 минуты 22 секунды:
УРА!!! РАБОТАЕТ!!!

Вот установки, которые нужно сделать:
Код: Выделить всё
  SQLQuery.Active := false;
  SQLQuery.UsePrimaryKeyAsKey := true;
  SQLQuery.UpdateMode    := upWhereAll;     


Понятие Providerflags - там напрочь отсутствует (в смысле первая часть описания ложная). Зато вторая работает как часы!

Всем хорошего настроения!
.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: [решено] Отсутствует ID, SQLQuery как сохранять?

Сообщение Снег Север » 25.02.2016 09:46:29

vitaly_l писал(а):Именно про такие я и говорил. Но судя по Вашему ответу Вы просто никогда их не перезаписывали и поэтому почему-то стали утверждать, что это вообще невозможно

Вы удивительно плохо понимаете написанные тексты. Перезаписывали, конечно, я и писак как - выполнением запроса update. А через автозапрос компонента - нет, потому что это называется удалять гланды через анус.
vitaly_l писал(а):как эти поля ей задать...

Задается, как правило, при создании таблицы. Я и не запоминал никогда синтаксис - делал через интерфейс HediSQL.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3053
Зарегистрирован: 27.11.2007 16:14:47

Re: [решено] Отсутствует ID, SQLQuery как сохранять?

Сообщение vitaly_l » 25.02.2016 10:05:56

Снег Север писал(а):Вы удивительно плохо понимаете написанные тексты.

Лучше посмотрите насколько ложно их(тексты) трактуете Вы:
Снег Север писал(а):Задается, как правило, при создании таблицы.

Это нужно задавать в коде Лазаруса, а не при создании таблиц. И именно в настройках SQLQuery.
Но постольку поскольку я выбрал сравнение сразу по всем колонкам, то я к моему счастью - ничего и не задаю.
И заметьте в топике речь о настройках SQLQuery, так что проблем с чтением текстов у вас не возникает?
Отвечать ненужно, т.к. это в пределах нормы.


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: [решено] Отсутствует ID, SQLQuery как сохранять?

Сообщение sign » 25.02.2016 10:17:55

vitaly_l писал(а):если в запросе выводится ID, то SQLQuery.ApplyUpdates всё сохраняет и всё работает.

Я в своё время, послушавшись доброго совета, никогда не использую всякую хрень.
Только запросы к базе, только SQL код - SELECT, INSERT, UPDATE, REPLACE, что позволяет на 100% контролировать происходящее и пилювать, что там в каком языке придумали.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: [решено] Отсутствует ID, SQLQuery как сохранять?

Сообщение vitaly_l » 25.02.2016 11:03:51

sign писал(а):Только запросы к базе, только SQL код - SELECT, INSERT, UPDATE, REPLACE, что позволяет на 100% контролировать происходящее и пилювать, что там в каком языке придумали.

Вообще, для перебора 100000 строк, по другому и невозможно. Но когда я редактирую РУЧКАМИ одну единственную строчку... мне кажется Лазарусовский - должен справиться. Если это не так то поправьте меня пожалуйста, т.к. я решил сделать себе альтернативу phpMyAdmin, т.к. лазарусовский код работает быстрее и мне нужны всякие удобные штуки, которых в phpMyAdmin мне не хватает. И поэтому мне очень важно, чтобы в программе всё работало точно как часы.

Поэтому если есть какие-то сбои или предпосылки к ним, при использовании ApplyUpdates или autocommit, то расскажите о них: пожалуйста.


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: [решено] Отсутствует ID, SQLQuery как сохранять?

Сообщение resident » 25.02.2016 11:33:51

vitaly_l писал(а):Вот только примера нет, как эти поля ей задать... там ведь несколько нужно. Через запятую? В кавычках? В квадратных скобках?

Код: Выделить всё
qrTable.FieldByName('abracadabra').ProviderFlags := [pfInkey, pfInWhere, pfInUpdate];


vitaly_l писал(а):т.к. иерархия, организация структуры и принцип работы разный

Это провокация

vitaly_l писал(а):Понятие Providerflags - там напрочь отсутствует (в смысле первая часть описания ложная).

Да ну? Заинтриговали. Проверьте значения ProviderFlags без вашего кода
Код: Выделить всё
UsePrimaryKeyAsKey := true
, это еще не все, это свойство найдите в инспекторе объектов и выключите.
Что-то типа такого вставьте
Код: Выделить всё
    i, j: integer;
    s: string;

Код: Выделить всё
        s := '';
        with qrQuery1 do
        for i := 0 to Pred(FieldCount) do
          begin
            S := Fields[i].FieldName + ' >>> ';
            if pfInkey in Fields[i].ProviderFlags then S := S + ' pfInkey';
            if pfInWhere in Fields[i].ProviderFlags then S := S + ' pfInWhere';
            if pfInUpdate in Fields[i].ProviderFlags then S := S + ' pfInUpdate';
            if pfHidden in Fields[i].ProviderFlags then S := S + ' pfHidden';
            if pfRefreshOnInsert in Fields[i].ProviderFlags then S := S + ' pfRefreshOnInsert';
            if pfRefreshOnUpdate in Fields[i].ProviderFlags then S := S + ' pfRefreshOnUpdate';
            ShowMessage(S);
          end; 

Я был не то чтобы удивлен, но какой же Лазарус догадливый, он сам узнает ключевое поле (у меня оно есть), если включить UsePrimaryKeyAsKey. Откуда? Может с сервером пообщался? Ну да это не ваш случай.
А по вашему коду - все четко по инструкции, все поля у меня имеют pfInWhere и если вы задали upWhereAll, то все их и загнали в секцию where команды SQL. Судя по документации, с вероятностью 99% ставлю на то, что ваша система заработает и при отключенном UsePrimaryKeyAsKey.
Таким образом ваше решение неоптимально, т.к. увеличиваете нагрузку вычислений и больше гоняете данных через сеть.

Снег Север писал(а): А через автозапрос компонента - нет, потому что это называется удалять гланды через анус.

Мне нужна локальная база данных с шифрованием. Что бы вы использовали?
з.ы. "гланды через анус", хорошее название для портфельных баз. Они вообще не в тренде?

Добавлено спустя 16 минут 24 секунды:
vitaly_l писал(а):Поэтому если есть какие-то сбои или предпосылки к ним, при использовании ApplyUpdates или autocommit, то расскажите о них: пожалуйста.

viewtopic.php?f=5&t=10934
С 1.6 всё хорошо пока
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: [решено] Отсутствует ID, SQLQuery как сохранять?

Сообщение vitaly_l » 25.02.2016 12:14:45

resident писал(а):qrTable.FieldByName('abracadabra').ProviderFlags := [pfInkey, pfInWhere, pfInUpdate];
if pfInkey in Fields[i].ProviderFlags then ...

Круто, спасибо. Теперь мне ещё более понятно как оно устроено в SQLQuery.
Теперь, с учётом остальных пояснений - всё устройство почти как на ладони. <=== Спасибо, очень важные дополнения.
resident писал(а):С 1.6 всё хорошо пока

Да, я заметил, там даже DBF починили (ну или по крайней мере я починку только в 1.6.увидел).


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: [решено] Отсутствует ID, SQLQuery как сохранять?

Сообщение debi12345 » 25.02.2016 12:29:46

1) сохранять по другому (комбинированному из нескольких полей - помеченых в prividerFlags) критерию уникальности;
2) если БД на PostgreSQL и таблица создана без извратов (не запрещая OID), то можно вытащить поле с дополнительным полем IOD:
SELECT oid,* FROM table

и использовать его в WHERE+providerFlags.

ПС: минус OID - они (кажется INT64) рано или поздно переполнятся, при этом их значения не укоротишь (во избежание переполнения) при урезании таблицы.

Добавлено спустя 6 минут 59 секунд:
Код: Выделить всё
SQLQuery.UsePrimaryKeyAsKey := true;

Это если БД-драйвер конкретной БД смог найти и опознать этот первичный ключ-индекс -который к тому же может быть создан без указания что он первичный ключ.
Я бы такую фишку не закладывался :)
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: [решено] Отсутствует ID, SQLQuery как сохранять?

Сообщение vitaly_l » 25.02.2016 16:55:48

debi12345 писал(а):если БД на PostgreSQL и таблица создана без извратов (не запрещая OID), то можно вытащить поле с дополнительным полем IOD

Скорее всего в MySQL этого нет. По крайней мере я про OID никогда не слышал. Судя по описанию Вы говорите про обычный автоинкрементный id.

debi12345 писал(а):Это если БД-драйвер конкретной БД смог найти и опознать этот первичный ключ-индекс -который к тому же может быть создан без указания что он первичный ключ.

Да я понял уже, вначале плохо разобрался что там к чему; имело смысл ставить SQLQuery.UsePrimaryKeyAsKey := false;
______________________________________________________________________
А вот ещё вопрос про SQLQuery.

Например у меня в таблице сделан хитрый индекс на несколько колонок, например с именами: `a`,`b` и `c` сам индекс называю: `i_abc`делаю его командой CREATE INDEX и т.д.
:?: Вопрос:
Я могу как-то опираться на этот `i_abc` индекс из SQLQuery или он работает только на стороне базы ? (минуя SQL запросы к базе естественно)


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: [решено] Отсутствует ID, SQLQuery как сохранять?

Сообщение debi12345 » 25.02.2016 20:25:43

могу как-то опираться на этот `i_abc` индекс из SQLQuery или он работает только на стороне базы

Можно использовать для проверки уникальности при операциях вставки-редактирования без предварительной SELECT-проверки (в норме подразумевающей выставление блокировки таблицы для других коннектов) - перехватывая DB-исключение, далее откатывая транзакцию (если была активирована), далее фильтруя сообщение об ошибке на предмет названия этого индекса. Найдено название - можно показать юзеру матюк "Какого х... не соблюдаешь уникальность по ...?!"

Также можно прошерстить код SQLDB для данной БД и найти где вытаскиваются индексы и первичные ключи - и если что-то (список полей для индекса) есть, то...
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: [решено] Отсутствует ID, SQLQuery как сохранять?

Сообщение resident » 26.02.2016 02:12:13

debi12345 писал(а):Это если БД-драйвер конкретной БД смог найти и опознать этот первичный ключ-индекс -который к тому же может быть создан без указания что он первичный ключ.
Я бы такую фишку не закладывался

Ok
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Пред.След.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 240

Рейтинг@Mail.ru