Sign in Join
Wiki copytemporary

SQLite/ru: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11## Поддержка SQLite и FPC/Lazarus
22
33SQLite - это встроенная (не серверная) однопользовательская база данных, которую можно использовать в приложениях FPC и Lazarus. Для доступа к SQLite из программ FPC/Lazarus можно использовать различные драйверы. Все драйверы нуждаются в библиотеке SQLite/dll в исполняемом каталоге (который может быть каталогом вашего проекта или, например, (projectdir)/lib/architecture/ в зависимости от настроек вашего проекта Lazarus) (и распространяется вместе с вашим исполняемым файлом) для работы.
44
55Это также может быть необходимо включить в ваш каталог Lazarus IDE. См. [ветку форума](https://forum.lazarus.freepascal.org/index.php?topic=46118.msg327940#msg327940) и особенно внимательно прочитайте про TSQLite3Dataset и TSQLiteDataset [[SQLite/ru|ниже]]
66
77В большинстве дистрибутивов Linux по умолчанию установлен sqlite3 (например, libsqlite3.so.0), но для дистрибутивов Ubuntu, по крайней мере, также требуется соответствующий пакет Dev. Оба должны быть установлены через системный менеджер пакетов и помечены как зависимость, а не распространяться вместе с вашим приложением.
88
99Win64: см. предупреждение [[Windows Programming Tips|здесь]] о неиспользовании определенных версий FPC/Lazarus Win64.
1010
1111### Прямой доступ к SQLite
1212
1313Вы можете использовать простой способ подключения SQLite к Lazarus. Компоненты называются LiteDAC. Компоненты доступа к данным SQLite (LiteDAC) - это библиотека компонентов, которая обеспечивает встроенное подключение к SQLite из Lazarus (и Free Pascal) в Windows, macOS, iOS, Android, Linux и FreeBSD как для 32-разрядных, так и для 64-разрядных платформ. LiteDAC предназначен для программистов, которые могут разрабатывать действительно кроссплатформенные настольные и мобильные приложения баз данных SQLite без необходимости развертывания каких-либо дополнительных библиотек.
1414
1515Вы можете скачать пробную версию этого коммерческого продукта по адресу _<https://www.devart.com/litedac/download.html> (LiteDAC 4.4 for Lazarus (FreePascal))
1616
1717### Встроенный SQLDB
1818
1919FPC/Lazarus предлагает встроенные компоненты SQLDB, которые включают поддержку баз данных SQLite ([[TSQLite3Connection]]) с [[SQLdb tab|вкладки SQLdb]] в [[Component Palette|Палитре компонентов]], которые позволяют, например, создавать графические интерфейсы пользователя с такими компонентами базы данных, как [[TDBGrid]]. Преимущество использования SQLDB заключается в том, что довольно легко перейти на другую базу данных, такую ​​как Firebird или PostgreSQL, без особых изменений в программе. Подробнее см. ниже.
2020
2121#### Поддержка Spatialite
2222
2323Spatialite - это ГИС-расширения SQLite, которые можно использовать из SQLDB. См. [[Spatialite]].
2424
2525#### Поддержка шифрования SQLite
2626
2727В последних версиях FPC (реализованных в марте 2012 г.) SQLDB включал поддержку некоторых расширенных версий SQLite3, которые шифруют файл базы данных SQLite с использованием алгоритма AES. Используйте свойство пароля, чтобы установить ключ шифрования.
2828
2929Примеры:
3030
3131- [SQLCipher](http://sqlcipher.net/): Открытый исходный код, например Бинарные файлы Windows не бесплатно (их нужно скомпилировать самостоятельно)
3232- [System.Data.SQLite](http://system.data.sqlite.org/): с открытым исходным кодом, доступны двоичные файлы Windows (32, 64, CE), загрузите, например, один из предварительно скомпилированных двоичных файлов и переименуйте SQLite.Interop.dll в sqlite3.dll (если вы используете статически связанные файлы, вероятно, вам нужно переименовать System.Data.SQLite.DLL в sqlite3.dll)
3333- [wxSQLite3](http://wxcode.sourceforge.net/docs/wxsqlite3/): открытый исходный код, доступны некоторые бинарные файлы для Linux (напр: <https://launchpad.net/ubuntu/oneiric/+package/libwxsqlite3-2.8-0>)
3434- [sqleet](https://github.com/resilar/sqleet): открытый исходный код, нет зависимостей от других библиотек, легко собирается при помощи GCC в исполняемые файлы и файлы библиотек, кроссплаформенный. Доступны механизмы шифрования как в интерактивном режиме, так и посредством sqleet API.
3535
3636#### sqlite3backup
3737
3838sqlite3backup - это модуль, поставляемый с FPC (не в Lazarus, но может использоваться программно), который обеспечивает функции резервного копирования/восстановления для SQLite3. Он использует SQLDB sqlite3conn.
3939
4040### Zeos
4141
4242[Zeos](https://sourceforge.net/projects/zeoslib/)
4343
4444### SQLitePass
4545
4646Компоненты [SQLitePass](http://source.online.free.fr/). Последнее обновление кода в 2010. Последняя активность на форуме в 2011.
4747
4848### TSQLite3Dataset и TSQLiteDataset
4949
5050Существуют также отдельные пакеты TSQLiteDataset (модуль sqlite) и TSQLite3Dataset (модуль sqlite3ds); см. ниже описание того, как их использовать. Посетите [домашнюю страницу sqlite4fpc](http://sqlite4fpc.yolasite.com/), чтобы найти справочник по API и другие руководства.
5151
5252TSqliteDataset и TSqlite3Dataset являются потомками [[TDataSet]], которые обращаются к базам данных sqlite 2.8.x и 3.x.x соответственно. Для новых проектов вы, вероятно, будете использовать TSQlite3Dataset, поскольку текущая версия SQLite 3.x.
5353
5454Ниже приведен список основных преимуществ и недостатков по сравнению с другими драйверами/методами доступа FPC/Lazarus SQLite:
5555
5656Преимущества:
5757
5858- Гибкость: программисты могут выбирать, использовать или не использовать язык SQL, что позволяет им работать с простыми макетами таблиц или любым сложным макетом, который позволяет SQL/sqlite.
5959
6060Недостатки:
6161
6262- Переход на другие базы данных сложнее, чем при использовании компонентов SQLDB или Zeos
6363
6464> **Note:** Учитывая вышеизложенное, многие пользователи будут использовать SQLDB или Zeos из-за преимуществ, если им не нужен низкоуровневый доступ к библиотеке SQLite.
6565
6666## Использование компонентов SQLdb со SQLite
6767
6868Эти инструкции сосредоточены на особенностях SQLDB (TSQLite3Connection) для SQLite. Для общего обзора ознакомьтесь с [[SqlDBHowto|SqlDB: Howto]], где есть полезная информация о компонентах SQLdb.
6969
7070См. [[SQLdb Tutorial1|Учебник1 по SQLdb]] для обучения создания программы с поддержкой базы данных с графическим интерфейсом пользователя, которая написана для SQLite/SQLDB (а также для Firebird/SQLDB, PostgreSQL/SQLDB, в основном любой СУБД, поддерживаемой SQLDB).
7171
7272Мы будем использовать комбинацию из трех компонентов из вкладки Lazarus SQLdb: TSQLite3Connection, TSQLTransaction и TSQLQuery. TSQLQuery действует как наш TDataset; в простейшем случае это просто одна из наших таблиц. Для простоты: убедитесь, что у вас уже есть существующий файл базы данных SQLite, и вам не нужно создавать новый сейчас. TSQLite3Connection можно найти в модуле sqlite3conn, если вы хотите объявить его самостоятельно или работаете в FreePascal.
7373
7474Эти три компонента связаны друг с другом как обычно: в TSQLQuery установите свойства Database и Transaction, в TSQLTransaction установите свойство Database. В компонентах Transaction и Connection особо нечего делать, большинство интересного будет сделано в TSQLQuery. Настройте компоненты следующим образом:
7575
76-<b>TSQLite3Connection</b>:
76+TSQLite3Connection:
7777
78-- DatabaseName: установите для этого свойства имя файла (абсолютный путь!) вашего файла SQLite. К сожалению, вы не можете просто использовать относительный путь, который работает без изменений во время разработки и во время выполнения (<i>это все еще верно? Разве вы не можете просто скопировать файл db в сценарий оболочки после сборки или создать символическую ссылку на него? </i>). Вы должны убедиться, что при запуске приложения правильный путь к файлу всегда устанавливается программно, независимо от того, что он содержал во время разработки.
78+- DatabaseName: установите для этого свойства имя файла (абсолютный путь!) вашего файла SQLite. К сожалению, вы не можете просто использовать относительный путь, который работает без изменений во время разработки и во время выполнения (это все еще верно? Разве вы не можете просто скопировать файл db в сценарий оболочки после сборки или создать символическую ссылку на него? ). Вы должны убедиться, что при запуске приложения правильный путь к файлу всегда устанавливается программно, независимо от того, что он содержал во время разработки.
7979
8080> **Note:** Чтобы установить полный путь к библиотеке (если вы поместите свою sqlite dll/so/dylib в место, где ОС ее не найдет, например каталог приложения в Linux/OSX), вы можете установить «SQLiteLibraryName» свойство (ДО того, как будет установлено какое-либо соединение, например, в событии OnCreate главной формы)
8181
8282, например:
8383
8484``` pascal
8585SQLiteLibraryName:='./sqlite3.so';
8686```
8787
88-<b>TSQLQuery</b>:
88+TSQLQuery:
8989
9090- SQL: задайте для него простой запрос выбора для одной из ваших таблиц. Например, если у вас есть таблица 'foo' и вы хотите, чтобы этот набор данных представлял эту таблицу, просто используйте следующие:
9191 ``` SQL
9292 SELECT * FROM foo
9393 ```
9494
9595- Active: установите для него значение True в среде IDE, чтобы проверить, все ли настроено правильно. Это также автоматически активирует транзакцию и объекты подключения. Если вы получаете сообщение об ошибке, то либо DatabaseName соединения неверно, либо запрос SQL неверен. Позже, когда мы закончим добавление полей (см. ниже), снова установим их все в неактивные состояния, мы не хотим, чтобы среда IDE блокировала базу данных SQLite (для одного пользователя!) при тестировании приложения.
9696
9797- *Наверное, не нужно для правильной работы - нужно будет проверить (June 2012)* Теперь мы можем добавить поля в наш TSQLQuery. Пока компоненты все еще активны, щелкните правой кнопкой мыши и «отредактируйте поля ...». Нажмите кнопку «+» и добавьте поля. В нем будут перечислены все поля, возвращенные вашим SQL-запросом. Добавьте все поля, которые вам понадобятся, вы также можете добавить сюда поля поиска; в этом случае просто убедитесь, что вы уже определили все необходимые поля в других наборах данных, прежде чем начинать добавлять поля поиска, которые ссылаются на них. Если в вашей таблице много столбцов, и они вам не нужны, вы можете просто не указывать их, а также сделать свой SQL более конкретным.
9898
9999- В вашем коде вам нужно вызвать SQLQuery.ApplyUpdates и SQLTransaction.Commit, события TSQLQuery.AfterPost и AfterInsert - хорошее место для этого при использовании его с элементами управления с учетом данных, но, конечно, вы также можете отложить эти вызовы на более позднее время. Если вы не вызовете их, база данных не будет обновлена.
100100
101101- "Database is locked" (База данных заблокирована): IDE может по-прежнему блокировать базу данных (SQLite - это база данных для одного пользователя), вы, вероятно, забыли установить компоненты в неактивное состояние и снова отключить их после того, как вы закончили определение всех полей ваших объектов TSQLQuery. Используйте событие OnCreate формы, чтобы задать путь и активировать объекты только во время выполнения. Большинство вещей, которые вы устанавливаете в TSQLQuery из среды IDE, не требуют (а некоторые даже не позволяют), чтобы они были активными во время разработки, единственным исключением является определение полей, в которых он хочет прочитать дизайн таблицы, поэтому неактивность во время разработки должно быть нормальным состоянием.
102102
103103- Все ваши таблицы должны иметь первичный ключ, и вы должны убедиться, что соответствующее поле имеет pfInKey и ничего больше в его PoviderFlags (эти флаги управляют тем, как и где используется поле при автоматическом построении запросов на обновление и удаление).
104104
105105- Если вы используете lookup-поля
106106 - убедитесь, что ProviderFlags для lookup-поля полностью пуст, чтобы он не пытался использовать свое имя в запросе на обновление. Само поле поиска не является полем данных, оно действует только на значение другого поля, соответствующего ключевого поля, и только это ключевое поле будет позже использоваться в запросах на обновление. Вы можете установить ключевое поле как скрытое, потому что обычно вы не хотите видеть его в своей DBGrid, но его необходимо определить.
107107 - LookupCache должен иметь значение True. На момент написания этой статьи по какой-то причине в -lookupполе ничего не отображается (но все равно работает), и, как ни странно, происходит полная противоположность при работе с TSQLite3Dataset или другими компонентами TXXXDataset, здесь должно быть установлено значение False. Я еще не уверен, является ли это предполагаемым поведением или ошибкой.
108108
109109- Обычно для простых таблиц вам не нужно устанавливать какие-либо свойства InsertSQL, UpdateSQL и DeleteSQL, просто оставьте их пустыми. Если у вас правильно установлены ProviderFlags всех ваших полей, он сможет создать необходимый SQL на лету. Подробнее об InsertSQL, UpdateSQL и DeleteSQL см. [[Working With TSQLQuery|Работа с TSQLQuery]].
110110
111111После того, как все вышеперечисленное будет настроено правильно, вы сможете использовать TSQLQuery, как и любой другой TDataset, либо программно манипулируя его данными, либо помещая TDatasouce в форму, подключая его к TSQLQuery, а затем используя контуры данных, такие как TDBGrid и т.п.
112112
113113### Creating a Database
114114
115115Метод [TSQLite3Connection.CreateDB](http://www.freepascal.org/docs-html/fcl/sqldb/tsqlconnection.createdb.html), унаследованный от родительского класса, на самом деле ничего не делает; чтобы создать базу данных, если файл еще не существует, вам просто нужно записать данные таблицы, как в следующем примере:
116116
117117(Код, извлеченный из примера sqlite_encryption_pragma, который поставляется с Lazarus 1.3 и новее)
118118
119119``` pascal
120120var
121121 newFile : Boolean;
122122begin
123123
124124 SQLite3Connection1.Close; // Убедитесь, что соединение закрыто при запуске
125125
126126 try
127127 //Поскольку мы делаем эту базу данных впервые,
128128 // проверяем, существует ли уже файл
129129 newFile := not FileExists(SQLite3Connection1.DatabaseName);
130130
131131 if newFile then
132132 begin
133133 // Создаем базу данных и таблицы
134134 try
135135 SQLite3Connection1.Open;
136136 SQLTransaction1.Active := true;
137137
138138 // Здесь мы настраиваем таблицу с именем "DATA" в новой базе данных.
139139 SQLite3Connection1.ExecuteDirect('CREATE TABLE "DATA"('+
140140 ' "id" Integer NOT NULL PRIMARY KEY AUTOINCREMENT,'+
141141 ' "Current_Time" DateTime NOT NULL,'+
142142 ' "User_Name" Char(128) NOT NULL,'+
143143 ' "Info" Char(128) NOT NULL);');
144144
145145 // Создание индекса на основе идентификатора в таблице "DATA"
146146 SQLite3Connection1.ExecuteDirect('CREATE UNIQUE INDEX "Data_id_idx" ON "DATA"( "id" );');
147147
148148 SQLTransaction1.Commit;
149149
150150 ShowMessage('База данных успешно создана.');
151151 except
152152 ShowMessage('Невозможно создать новую базу данных');
153153 end;
154154 end;
155155 except
156156 ShowMessage('Невозможно проверить, существует ли файл базы данных');
157157 end;
158158 end;
159159```
160160
161161### Создание определяемых пользователем порядка сортировки
162162
163163``` pascal
164164// utf8-callback функция сравнения с учетом регистра
165165function UTF8xCompare(user: pointer; len1: longint; data1: pointer; len2: longint; data2: pointer): longint; cdecl;
166166var S1, S2: AnsiString;
167167begin
168168 SetString(S1, data1, len1);
169169 SetString(S2, data2, len2);
170170 Result := UnicodeCompareStr(UTF8Decode(S1), UTF8Decode(S2));
171171end;
172172
173173// utf8-callback функция сравнения без учета регистра
174174function UTF8xCompare_CI(user: pointer; len1: longint; data1: pointer; len2: longint; data2: pointer): longint; cdecl;
175175var S1, S2: AnsiString;
176176begin
177177 SetString(S1, data1, len1);
178178 SetString(S2, data2, len2);
179179 Result := UnicodeCompareText(UTF8Decode(S1), UTF8Decode(S2));
180180end;
181181
182182// регистрируем порядок сортировки с помощью SQLite3 API (требуется модуль sqlite3dyn):
183183sqlite3_create_collation(SQLite3.Handle, 'UTF8_CI', SQLITE_UTF8, nil, @UTF8xCompare_CI);
184184// или используем метод TSQLite3Connection:
185185CreateCollation('UTF8_CI',1,nil,@UTF8xCompare_CI);
186186
187187// теперь мы можем использовать порядок сортировки без учета регистра в SQL, например:
188188// SELECT * FORM table1 WHERE column1 COLLATE UTF8_CI = 'á'
189189
190190// но это не работает для оператора LIKE
191191// чтобы поддерживать также оператор LIKE, мы должны перегрузить функцию LIKE по умолчанию, используя sqlite3_create_function ()
192192// http://www.sqlite.org/lang_corefunc.html#like
193193```
194194
195195### Создание пользовательских функций (UDF)
196196
197197``` pascal
198198// пример перегрузки функции LOWER() по умолчанию на функцию, предоставляемую пользователем
199199// чтобы запустить эту демку, вы должны добавить модули sqlite3dyn и ctypes в ваше предложение uses
200200// и добавить константу 'SQLITE_DETERMINISTIC' со значением $800
201201
202202procedure UTF8xLower(ctx: psqlite3_context; N: cint; V: ppsqlite3_value); cdecl;
203203var S: AnsiString;
204204begin
205205 SetString(S, sqlite3_value_text(V[0]), sqlite3_value_bytes(V[0]));
206206 S := UTF8Encode(AnsiLowerCase(UTF8Decode(S)));
207207 sqlite3_result_text(ctx, PAnsiChar(S), Length(S), sqlite3_destructor_type(SQLITE_TRANSIENT));
208208end;
209209
210210// регистрируем функцию LOWER() с помощью SQLite3 API (требуется модуль sqlite3dyn):
211211sqlite3_create_function(SQLite3.Handle, 'lower', 1, SQLITE_UTF8 or SQLITE_DETERMINISTIC, nil, @UTF8xLower, nil, nil);
212212```
213213
214214### SQLite3 и даты
215215
216216- SQLite 3 не хранит даты как специальное значение DateTime. Он может хранить их в виде строк, чисел двойной точности или целых чисел - см. [Date and Time Datatype](http://www.sqlite.org/datatype3.html#datetime).
217217- В строках разделителем даты является «-» в соответствии со стандартом SQL/ISO 8601. Таким образом, если вы выполняете INSERT с использованием встроенной функции DATE, она сохранит его как что-то вроде «ГГГГ-ММ-ДД».
218218- Чтение значения DateTime может вызвать проблемы для DataSet, если они хранятся в виде строк: квалификатор .AsDateTime может останавливаться на "строковой дате" SQLite, но это можно преодолеть, используя что-то вроде `strftime(`*`%d/%m/%Y`*`,recdate) AS sqlite3recdate` в вашем операторе SQL SELECT, который заставляет SQLite3 возвращать запись даты в указанном формате (строка формата %d/%m/%d соответствует вашему региональному формату даты, который будет пониматься как .AsDateTime) **==\> Пожалуйста, откройте отчет об ошибке с примером приложения, демонстрирующим проблему, если это так**
219-- При сравнении дат, хранящихся в виде строк (используя, например, функцию BETWEEN), помните, что сравнение всегда будет <b>строковым</b> сравнением и, следовательно, будет зависеть от того, как вы сохранили значение даты.
219+- При сравнении дат, хранящихся в виде строк (используя, например, функцию BETWEEN), помните, что сравнение всегда будет строковым сравнением и, следовательно, будет зависеть от того, как вы сохранили значение даты.
220220
221221#### Значения по умолчанию для местного времени вместо UTC
222222
223223CURRENT_TIME, CURRENT_DATE и CURRENT_TIMESTAMP возвращают текущую дату и/или время в формате UTC. Для местной даты и/или времени мы можем использовать:
224224
225225` DEFAULT (datetime('now','localtime')) for datetime values formated YYYY-MM-DD HH:MM:SS`\
226226` DEFAULT (date('now','localtime')) for date value formated YYYY-MM-DD`\
227227` DEFAULT (time('now','localtime')) for time value formated HH:MM:SS`
228228
229229### Устранение неполадок SQLDB и SQLite
230230
231231- Имейте в виду, что для поддержки работы времени разработки (поля и т.д.) Lazarus также должен найти sqlite3.dll (прим.перев: положите этот файл в корень IDE рядом с экзешником. Обратите внимание, что разрядность библиотеки должна соответствовать разрядности Лазаруса).
232232- То же самое и с именем файла базы данных. Всегда используйте абсолютный путь, если вы используете компоненты для извлечения, например, имена полей во время разработки. В противном случае IDE создаст в своем каталоге пустой файл. В случае возникновения проблем проверьте, не содержит ли каталог lazarus/ нулевую байтовую копию файла базы данных.
233233- Если у вас есть отношения master/detail, вам необходимо обновлять главный набор данных после каждой вставки, чтобы получить значение для поля внешнего ключа подчиненного набора данных. Это можно сделать в событии AfterPost основного набора данных, вызвав одну из следующих перегруженных процедур:
234234
235235``` pascal
236236interface
237237 procedure RefreshADatasetAfterInsert(pDataSet: TSQLQuery);overload;
238238 procedure RefreshADatasetAfterInsert(pDataSet: TSQLQuery; pKeyField: string);overload;
239239
240240implementation
241241
242242procedure RefreshADatasetAfterInsert(pDataSet: TSQLQuery; pKeyField: string);
243243// Эта процедура обновляет набор данных и помещает курсор на последнюю запись
244244// Используется, если Dataset не гарантирует сортировку набора данных по первичному ключу автоинкремента
245245var
246246 vLastID: Integer;
247247 vUpdateStatus : TUpdateStatus;
248248begin
249249 vUpdateStatus := pDataset.UpdateStatus;
250250 //Получаем последний вставленный ID в базе данных
251251 pDataset.ApplyUpdates;
252252 vLastID:=(pDataSet.DataBase as TSQLite3Connection).GetInsertID;
253253 //Теперь возвращаемся к соответствующей строке
254254 if vUpdateStatus = usInserted then begin
255255 pDataset.Refresh;
256256 //Обновляемся и возвращаемся к соответствующей строке
257257 pDataset.Locate(pKeyField,vLastID,[]);
258258 end;
259259end;
260260
261261procedure RefreshADatasetAfterInsert(pDataSet: TSQLQuery);
262262//Эта процедура обновляет набор данных и помещает курсор на последнюю запись
263263//Используется только в том случае, если DataSet гарантированно отсортирован по первичному ключу с автоинкрементом.
264264var
265265 vLastID: Integer;
266266 vUpdateStatus : TUpdateStatus;
267267begin
268268 vUpdateStatus := pDataset.UpdateStatus;
269269 pDataset.ApplyUpdates;
270270 vLastID:=(pDataSet.DataBase as TSQLite3Connection).GetInsertID;
271271 if vUpdateStatus = usInserted then begin
272272 pDataset.Refresh;
273273 //Опасно!
274274 pDataSet.Last;
275275 end;
276276end;
277277
278278procedure TDataModule1.SQLQuery1AfterPost(DataSet: TDataSet);
279279begin
280280 RefreshADatasetAfterInsert(Dataset as TSQLQuery); //Если ваш набор данных отсортирован по первичному ключу
281281end;
282282
283283procedure TDataModule1.SQLQuery2AfterPost(DataSet: TDataSet);
284284begin
285285 RefreshADatasetAfterInsert(Dataset as TSQLQuery, 'ID'); //если вы не уверены, что набор данных всегда сортируется по первичному ключу
286286end;
287287```
288288
289289### Vacuum и другие операции, которые необходимо выполнять вне транзакции
290290
291291Кажется, что SQLDB всегда требует подключения, но некоторые операции, такие как Pragma и Vacuum, должны Быть сделано вне транзакции. Хитрость заключается в том, чтобы завершить транзакцию, выполнить то, что вы должны, и начать транзакцию еще раз (чтобы не запутать sqldb):
292292
293293``` pascal
294294 // коммит любых ожидающих операций или использование «свежего» соединения sql
295295 Conn.ExecuteDirect('End Transaction'); // Завершение транзакции, начатой SQLdb
296296 Conn.ExecuteDirect('Vacuum');
297297 Conn.ExecuteDirect('Begin Transaction'); //Запуск транзакции для использования SQLdb
298298```
299299
300300## Использование TSQLite3Dataset
301301
302302В этом разделе подробно описано, как использовать компоненты TSQLite2Dataset и TSQLite3Dataset для доступа к базам данных SQlite (от Luiz Américo luizmed(at)oi(dot)com(dot))br
303303
304304#### Требования
305305
306306- Для баз данных sqlite2 (legacy):
307307 - FPC 2.0.0 или выше
308308 - Lazarus 0.9.10 или выше
309309 - SQLite runtime библиотеки 2.8.15 или выше*
310310
311311- Sqlite2 больше не поддерживается, и двоичный файл не может быть найден на сайте sqlite
312312
313313- Для баз данных sqlite3:
314314 - FPC 2.0.2 или выше
315315 - Lazarus 0.9.11 (svn revision 8443) или выше
316316 - sqlite runtime библиотеки 3.2.1 или выше (можно получить с [www.sqlite.org](http://www.sqlite.org))
317317
318318**Перед запуском проекта lazarus убедитесь, что:**
319319
320320- библиотека sqlite либо
321321 - прописана в системной переменной PATH или
322322 - находится в каталоге вывода исполняемых файлов и в каталогах Lazarus (или текущего проекта) - этот параметр может работать только в Windows
323323- в Linux поместите `cmem` в качестве первого модуля в разделе `uses` основной программы
324324 - В Debian, Ubuntu и других подобных Debian дистрибутивах для создания Lazarus IDE необходимо установить пакеты libsqlite-dev/libsqlite3-dev, а не только sqlite/sqlite3 (также относится к OpenSuSe)
325325
326326#### Как использовать (базовое использование)
327327
328328Установить пакет, который находится в каталоге /components/sqlite (см. инструкции [[Install Packages/ru|здесь]]) (прим.перев.: на момент перевода статьи это можно сделать через стандартный установщик пакетов Лазаруса из меню Package(Пакеты) --\> Install/Uninstall Package (Установка/Удаление пакетов) --\> справа в окне Available for installation (Доступные для установки) выбираем sqlite3laz 0.4 --\> ниже жмем кнопку Install Selection (Установить выбранное) --\> жмем в самом низу кнопку Save and rebuild IDE (Сохранить и пересобрать IDE)).
329329
330330Во время разработки установите следующие свойства:
331331
332332- FileName: путь к файлу sqlite \[обязательно\]
333333- TableName: имя таблицы, используемой в операторе sql \[обязательно\]
334334- SQL: оператор выбора SQL \[по желанию\]
335335- SaveOnClose: значение по умолчанию - false, что означает, что изменения не сохраняются. Его можно изменить на true. \[по желанию\]
336336- Active: необходимо установить во время разработки или при запуске программы. \[обязательно\]
337337
338338**Создание Table (Dataset)**
339339
340340Дважды щелкните значок компонента или используйте пункт 'Create Table'(Создать таблицу) во всплывающем меню, которое появляется при нажатии правой кнопки мыши. Будет показан простой редактор таблиц с пояснениями.
341341
342342Вот все типы полей, поддерживаемые TSqliteDataset и TSqlite3Dataset:
343343
344344- Integer
345345- AutoInc
346346- String
347347- Memo
348348- Bool
349349- Float
350350- Word
351351- DateTime
352352- Date
353353- Time
354354- LargeInt
355355- Currency
356356
357357**Получение данных**
358358
359359После создания таблицы или с помощью ранее созданной таблицы откройте набор данных с помощью метода Open. Если свойство SQL не было установлено, будут извлечены все записи из всех полей, то же самое можно получить, если вы зададите SQL следующим образом:
360360
361361``` pascal
362362SQL := 'Select * from TABLENAME';
363363```
364364
365365**Применение изменений к базовому файлу данных**
366366
367367Чтобы использовать функцию ApplyUpdates, набор данных должен содержать по крайней мере одно поле, которое удовлетворяет требованиям для первичного ключа (значения должны быть UNIQUE, а не NULL)
368368
369369Сделать это можно двумя способами:
370370
371371- Установить свойство PrimaryKey на имя поля первичного ключа
372372- Добавить поле AutoInc (это проще, поскольку TSqliteDataSet автоматически обрабатывает его как первичный ключ)
373373
374374Если установлено одно из двух условий, просто вызовите
375375
376376``` pascal
377377ApplyUpdates;
378378```
379379
380380> **Note:** Если заданы оба условия, поле, соответствующее PrimaryKey, используется для применения обновлений.
381381
382382> **Note:** Установка PrimaryKey в поле, которое не является первичным ключом, приведет к потере данных при вызове ApplyUpdates, поэтому перед его использованием убедитесь, что выбранное поле не содержит значений Null и Unique.
383383
384384##### Пример Master/detail
385385
386386Различные примеры отношений master/detail (например, отношения между клиентом и заказами):
387387
388388- общий способ SQLDB для этого с использованием свойства `DataSource`: [[MasterDetail]]
389389- Конкретный пример TSQLite3 с использованием метода `locate`: [[TSqlite3 Master Detail Example|пример TSqlite3 Master Detail]].
390390
391391#### Примечания
392392
393393- Несмотря на то, что TSqliteDataset был протестирован с 10 000 записей и работал нормально, все данные хранятся (прим.перев.: кешируются) в памяти, поэтому не забывайте извлекать только необходимые данные (особенно с полями Memo).
394394- Один и тот же файл данных (свойство Filename) может содержать несколько таблиц/наборов данных.
395395- Несколько наборов данных (разные комбинации полей) могут быть созданы с использованием одной и той же таблицы одновременно
396396- Можно фильтровать данные с помощью операторов WHERE в sql, закрывая и повторно открывая набор данных (или вызывая метод RefetchData). Но в этом случае порядок и количество полей должны оставаться прежними.
397397- Также можно использовать сложные операторы SQL, используя псевдонимы, объединения, представления в нескольких таблицах (помните, что они должны находиться в одном файле данных), но в этом случае ApplyUpdates не будет работать. Если кто-то хочет использовать сложные запросы и применить обновления к файлу данных, напишите мне, и я дам несколько советов, как это сделать.
398398- Установка имени файла в файл данных sqlite, не созданный TSqliteDataset, и его открытие разрешено, но в некоторых полях не будет обнаружен правильный тип поля. Они будут рассматриваться как строковые поля.
399399
400400Общие примеры можно найти в SVN каталоге fpc/fcl-db/src/sqlite.
401401
402402## See also
403403
404404- [[SQLdb Tutorial1]] Учебник по Sqlite
405405- [[SqlDBHowto]] Общая информация о SQLDB
406406- [[Working With TSQLQuery]] Информация о SQLDB's TSQLQuery
407407- [SQLite site](http://www.sqlite.org)
408408- [TSQLConnection](https://www.freepascal.org/docs-html/fcl/sqldb/tsqlconnection.html)
409409
410410---
411411*From the Free Pascal wiki, page "SQLite/ru", as it stood on 2021-11-16 after a change by Slawek, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history