Работа с MySQL 5.6

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

Работа с MySQL 5.6

Сообщение arriah » 10.07.2016 01:21:42

Привет всем,

Вобщем быстро написанная на коленках софтина для работы с MySQL принесла свои результаты. Вроде бы надо успокоится, но нет - потенциал у софтины еще огромнейший, есть куда расти, да и время не поджимает с наращиванием функционала, а по сему несколько вопросов:

1. Что в конечном итоге лучше использовать для подключения и работы с MySQL - SQLdb или Zeos?
Попробовал и то и то, разницы особой не заметил. Софтина работает с удаленной базой и в пакетном режиме обрабатывает кучу данных, в идеале хочется чтобы вначале вносились изменения в набор данных, а после уже отправлялись в базу, при чем надо отслеживать эту транзакцию - если какой-то сбой в соединении, то транзакцию не проводить - вобщем надо как-то побеспокоится о целостности БД. Я попробовал SQLTransaction - но если честно не понял, как оно работает. В ZConnection есть свойство AutoCommit - что оно делает? По дефолту стоит в true. Я так понимаю оно автоматом записывает изменение в набор данных, типа SQLQuery.Post?

В SQLdb достаточно было закинуть libmysql.dll в корень проекта, а в zeos пришлось дополнительно указывать путь к библиотеке в LibraryLocation. Так и должно быть? Просто я тоже в корень проекта закинул либу, но пока не прописал к ней путь ничего не работало.

2. Как более грамотно работать с несколькими таблицами. Сейчас софтина только изменяет данные в БД, но в будущем хочется чтобы она туда их добавляла. Например есть две таблицы: d_post (id, news, date, title) и d_image(id, news_id,image). То есть получается если в в d_post у news имеется картинка, то она живет в image и связывается по полям d_post.id=d_image.news_id. Если у news картинки нет, то соответственно и нет записи в d_image
Вот как правильно добавить картинку в БД через софтину (вернее не картинку, а путь до нее)
Например софтиной в news вношу изменение что есть картинка, далее SQLQuery.Post и SQLQuery.ApplyUpdates - изменения в БД сохранены, но теперь надо выполнить и INSERT - это придется создавать другой запрос? Или можно как-то по другому?

НУ и немного об совершенстве интерфейса :)

Сейчас на форме DBGrid, в котором отображается 2 колонки - date и title, и также DBmemo в котором показывается news. Date имеет тип DateTime и показываеся в формате "мм.дд.гггг чч.мм", что в принципе не очень удобно. Хочу сделать через DBLookUpCombobox, чтобы показывалась только дата, без времени. Но что-то у меня с ней не срослось. Выставляю ListSource - источник данных и KeyField - поле которое выводить (date). Запускаю - в комбобксе показывается дата как и было задуманно, но при выборе любого значения в DBMemo ничего не происходить, а если эту же дату выбрать в гриде - то все нормально. Где я накосячил?
И как мне потом эту дату отфильтровать? То есть если из отображения даты убрать время, то получить список с неповторяющимися значениями даты?
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: Работа с MySQL 5.6

Сообщение Снег Север » 11.07.2016 08:00:28

1. По моему субъективному мнению Zeos надежнее. Но особо настаивать не стану.
2. Я стараюсь всегда и всюду формировать запросы вручную. В т.ч. добавление данных (картинок). Небольшие картинки засовываю непосредственно в БД (в blob).
Работа с датами - тот еще геморрой. Дату в нужном текстовом формате можно сделать в запросе через DATE_FORMAT, но это годится только для отображения.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Работа с MySQL 5.6

Сообщение DYUMON » 11.07.2016 11:59:59

что тебе мешает получать d_post.id перед тем как писать в d_image ?
Аватара пользователя
DYUMON
постоялец
 
Сообщения: 234
Зарегистрирован: 11.03.2009 13:32:54

Re: Работа с MySQL 5.6

Сообщение arriah » 11.07.2016 12:22:02

DYUMON писал(а):что тебе мешает получать d_post.id перед тем как писать в d_image ?

Ничего не мешает, просто для изменения данных в d_post я использую SQLQuery.ApplyUpdates, но если в d_image отсутствует запись d_post.id мне придется делать другой запрос, так как таблицы разные.. в этом случае, запрос, который был ранее сформирован для d_post и открыт набор данных , он "пропадет"? Мне не придется делать снова запрос к d_post чтобы обработать следующую запись?

Или же в рамках одного SQLQuery можно делать запросы к разным таблицам данных одновременно?

то есть например:

В гриде отображается запрос из d_post
Выбираю запись - жму кнопку "Вставить изображения" - выполняется запрос к d_image...
А что в этот момент будет в гриде? Останутся данные от предыдущего запроса и можно будет продолжать работать или же после запроса к d_image придется снова выполнить запрос к d_post чтобы открыть данные?

Добавлено спустя 15 минут 14 секунд:
Снег Север писал(а):Работа с датами - тот еще геморрой. Дату в нужном текстовом формате можно сделать в запросе через DATE_FORMAT, но это годится только для отображения.

Ну работа с датами не такой уж и геморой

вот у меня выводится дата в формате datetime и после DATE_FORMAT(date, "%d.%m.%Y" ) as PostDate в запросе...

data.PNG


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

Пока сделал через DateTimePicker1.Date и в запросе... WHERE DATE(date) like %DateTimePicker1.Date%
Код: Выделить всё
SQLQuery1.SQL.Text:='SELECT * FROM d_post WHERE category=14 AND DATE (date) = :fdate ORDER BY date DESC';
SQLQuery1.ParamByName('fdate').AsDate:=DateTimePicker1.Date;

Но что-то мне не подуше этот DateTimePicker
У вас нет необходимых прав для просмотра вложений в этом сообщении.
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: Работа с MySQL 5.6

Сообщение arriah » 12.07.2016 23:46:22

Что-то не сростается у меня с Zeos

Пока не укажу путь к mysqllib.dll в LibraryLocation подключение не устнавливается. Хотя либа лежит в корне проекта.
Если указать полный путь к либе - работает, но тогда при переносе софта на другую машину она требует каталог который был указан при разработке

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

Причем пробовал в дельфях 7 - там такой проблемы нет..
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: Работа с MySQL 5.6

Сообщение DYUMON » 13.07.2016 09:07:21

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

для этих целей в запросе используют distinct
Аватара пользователя
DYUMON
постоялец
 
Сообщения: 234
Зарегистрирован: 11.03.2009 13:32:54

Re: Работа с MySQL 5.6

Сообщение arriah » 13.07.2016 11:21:38

arriah писал(а):Пока не укажу путь к mysqllib.dll в LibraryLocation подключение не устнавливается. Хотя либа лежит в корне проекта.
Если указать полный путь к либе - работает, но тогда при переносе софта на другую машину она требует каталог который был указан при разработке

Так, с этим решил вопрос. Оказывается либа должна быть в корне lasarus'a, а для переносимости в корне проекта.

DYUMON писал(а):для этих целей в запросе используют distinct

С этим я разобрался, а вот как заставить комбобох нормально работать - не могу
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: Работа с MySQL 5.6

Сообщение Снег Север » 13.07.2016 20:05:51

arriah писал(а):Пока не укажу путь к mysqllib.dll в LibraryLocation подключение не устнавливается.
Я обычно прописываю относительный путь, если в корне проекта, то .\
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Работа с MySQL 5.6

Сообщение DYUMON » 14.07.2016 07:25:50

кидаешь на форму комбобокс, затем выполняешь запрос на получения списка дат, после этого циклом заполняешь комбобокс.
Аватара пользователя
DYUMON
постоялец
 
Сообщения: 234
Зарегистрирован: 11.03.2009 13:32:54

Re: Работа с MySQL 5.6

Сообщение arriah » 15.07.2016 01:49:46

DYUMON писал(а):кидаешь на форму комбобокс, затем выполняешь запрос на получения списка дат, после этого циклом заполняешь комбобокс.

Угу. Это если с DBComboBox, а DBLookUpComBox и сам умеет заполняться значениями, вот только они почему то толком не работают
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: Работа с MySQL 5.6

Сообщение DYUMON » 15.07.2016 13:23:29

вот только они почему то толком не работают

а как они должны работать?
Аватара пользователя
DYUMON
постоялец
 
Сообщения: 234
Зарегистрирован: 11.03.2009 13:32:54

Re: Работа с MySQL 5.6

Сообщение arriah » 15.07.2016 16:41:04

DYUMON писал(а):
вот только они почему то толком не работают

а как они должны работать?

В начале топика я все описал
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: Работа с MySQL 5.6

Сообщение DYUMON » 15.07.2016 20:34:21

Понимаешь. dbcombobox и dblookupcombobox они предназначены для изменения значения, а не для навигации по записям. если ты хочешь что бы выборе значения у тебя менялись данные то обрабатывай событие dbcombobox.onchange
примерно так
Код: Выделить всё
procedure TForm1.DBComboBox1Change(Sender: TObject);
begin
  dataset.locate('key', значение, []);
end;
Аватара пользователя
DYUMON
постоялец
 
Сообщения: 234
Зарегистрирован: 11.03.2009 13:32:54


Вернуться в Базы данных

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

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

Рейтинг@Mail.ru