Sign in Join
Wiki copytemporary

SQLite/ru: what changed

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

Title: SQLite/ru

OldNewLine
1+## Поддержка SQLite и FPC/Lazarus
2+
3+SQLite - это встроенная (не серверная) однопользовательская база данных, которую можно использовать в приложениях FPC и Lazarus. Для доступа к SQLite из программ FPC/Lazarus можно использовать различные драйверы. Все драйверы нуждаются в библиотеке SQLite/dll в исполняемом каталоге (который может быть каталогом вашего проекта или, например, (projectdir)/lib/architecture/ в зависимости от настроек вашего проекта Lazarus) (и распространяется вместе с вашим исполняемым файлом) для работы.
4+
5+Это также может быть необходимо включить в ваш каталог Lazarus IDE. См. [ветку форума](https://forum.lazarus.freepascal.org/index.php?topic=46118.msg327940#msg327940) и особенно внимательно прочитайте про TSQLite3Dataset и TSQLiteDataset [[SQLite/ru|ниже]]
6+
7+В большинстве дистрибутивов Linux по умолчанию установлен sqlite3 (например, libsqlite3.so.0), но для дистрибутивов Ubuntu, по крайней мере, также требуется соответствующий пакет Dev. Оба должны быть установлены через системный менеджер пакетов и помечены как зависимость, а не распространяться вместе с вашим приложением.
8+
9+Win64: см. предупреждение [[Windows Programming Tips|здесь]] о неиспользовании определенных версий FPC/Lazarus Win64.
10+
11+### Прямой доступ к SQLite
12+
13+Вы можете использовать простой способ подключения SQLite к Lazarus. Компоненты называются LiteDAC. Компоненты доступа к данным SQLite (LiteDAC) - это библиотека компонентов, которая обеспечивает встроенное подключение к SQLite из Lazarus (и Free Pascal) в Windows, macOS, iOS, Android, Linux и FreeBSD как для 32-разрядных, так и для 64-разрядных платформ. LiteDAC предназначен для программистов, которые могут разрабатывать действительно кроссплатформенные настольные и мобильные приложения баз данных SQLite без необходимости развертывания каких-либо дополнительных библиотек.
14+
15+Вы можете скачать пробную версию этого коммерческого продукта по адресу _<https://www.devart.com/litedac/download.html> (LiteDAC 4.4 for Lazarus (FreePascal))
16+
17+### Встроенный SQLDB
18+
19+FPC/Lazarus предлагает встроенные компоненты SQLDB, которые включают поддержку баз данных SQLite ([[TSQLite3Connection]]) с [[SQLdb tab|вкладки SQLdb]] в [[Component Palette|Палитре компонентов]], которые позволяют, например, создавать графические интерфейсы пользователя с такими компонентами базы данных, как [[TDBGrid]]. Преимущество использования SQLDB заключается в том, что довольно легко перейти на другую базу данных, такую ​​как Firebird или PostgreSQL, без особых изменений в программе. Подробнее см. ниже.
20+
21+#### Поддержка Spatialite
22+
23+Spatialite - это ГИС-расширения SQLite, которые можно использовать из SQLDB. См. [[Spatialite]].
24+
25+#### Поддержка шифрования SQLite
26+
27+В последних версиях FPC (реализованных в марте 2012 г.) SQLDB включал поддержку некоторых расширенных версий SQLite3, которые шифруют файл базы данных SQLite с использованием алгоритма AES. Используйте свойство пароля, чтобы установить ключ шифрования.
28+
29+Примеры:
30+
31+- [SQLCipher](http://sqlcipher.net/): Открытый исходный код, например Бинарные файлы Windows не бесплатно (их нужно скомпилировать самостоятельно)
32+- [System.Data.SQLite](http://system.data.sqlite.org/): с открытым исходным кодом, доступны двоичные файлы Windows (32, 64, CE), загрузите, например, один из предварительно скомпилированных двоичных файлов и переименуйте SQLite.Interop.dll в sqlite3.dll (если вы используете статически связанные файлы, вероятно, вам нужно переименовать System.Data.SQLite.DLL в sqlite3.dll)
33+- [wxSQLite3](http://wxcode.sourceforge.net/docs/wxsqlite3/): открытый исходный код, доступны некоторые бинарные файлы для Linux (напр: <https://launchpad.net/ubuntu/oneiric/+package/libwxsqlite3-2.8-0>)
34+- [sqleet](https://github.com/resilar/sqleet): открытый исходный код, нет зависимостей от других библиотек, легко собирается при помощи GCC в исполняемые файлы и файлы библиотек, кроссплаформенный. Доступны механизмы шифрования как в интерактивном режиме, так и посредством sqleet API.
35+
36+#### sqlite3backup
37+
38+sqlite3backup - это модуль, поставляемый с FPC (не в Lazarus, но может использоваться программно), который обеспечивает функции резервного копирования/восстановления для SQLite3. Он использует SQLDB sqlite3conn.
39+
40+### Zeos
41+
42+[Zeos](https://sourceforge.net/projects/zeoslib/)
43+
44+### SQLitePass
45+
46+Компоненты [SQLitePass](http://source.online.free.fr/). Последнее обновление кода в 2010. Последняя активность на форуме в 2011.
47+
48+### TSQLite3Dataset и TSQLiteDataset
49+
50+Существуют также отдельные пакеты TSQLiteDataset (модуль sqlite) и TSQLite3Dataset (модуль sqlite3ds); см. ниже описание того, как их использовать. Посетите [домашнюю страницу sqlite4fpc](http://sqlite4fpc.yolasite.com/), чтобы найти справочник по API и другие руководства.
51+
52+TSqliteDataset и TSqlite3Dataset являются потомками [[TDataSet]], которые обращаются к базам данных sqlite 2.8.x и 3.x.x соответственно. Для новых проектов вы, вероятно, будете использовать TSQlite3Dataset, поскольку текущая версия SQLite 3.x.
53+
54+Ниже приведен список основных преимуществ и недостатков по сравнению с другими драйверами/методами доступа FPC/Lazarus SQLite:
55+
56+Преимущества:
57+
58+- Гибкость: программисты могут выбирать, использовать или не использовать язык SQL, что позволяет им работать с простыми макетами таблиц или любым сложным макетом, который позволяет SQL/sqlite.
59+
60+Недостатки:
61+
62+- Переход на другие базы данных сложнее, чем при использовании компонентов SQLDB или Zeos
63+
64+> **Note:** Учитывая вышеизложенное, многие пользователи будут использовать SQLDB или Zeos из-за преимуществ, если им не нужен низкоуровневый доступ к библиотеке SQLite.
65+
66+## Использование компонентов SQLdb со SQLite
67+
68+Эти инструкции сосредоточены на особенностях SQLDB (TSQLite3Connection) для SQLite. Для общего обзора ознакомьтесь с [[SqlDBHowto|SqlDB: Howto]], где есть полезная информация о компонентах SQLdb.
69+
70+См. [[SQLdb Tutorial1|Учебник1 по SQLdb]] для обучения создания программы с поддержкой базы данных с графическим интерфейсом пользователя, которая написана для SQLite/SQLDB (а также для Firebird/SQLDB, PostgreSQL/SQLDB, в основном любой СУБД, поддерживаемой SQLDB).
71+
72+Мы будем использовать комбинацию из трех компонентов из вкладки Lazarus SQLdb: TSQLite3Connection, TSQLTransaction и TSQLQuery. TSQLQuery действует как наш TDataset; в простейшем случае это просто одна из наших таблиц. Для простоты: убедитесь, что у вас уже есть существующий файл базы данных SQLite, и вам не нужно создавать новый сейчас. TSQLite3Connection можно найти в модуле sqlite3conn, если вы хотите объявить его самостоятельно или работаете в FreePascal.
73+
74+Эти три компонента связаны друг с другом как обычно: в TSQLQuery установите свойства Database и Transaction, в TSQLTransaction установите свойство Database. В компонентах Transaction и Connection особо нечего делать, большинство интересного будет сделано в TSQLQuery. Настройте компоненты следующим образом:
75+
76+<b>TSQLite3Connection</b>:
77+
78+- DatabaseName: установите для этого свойства имя файла (абсолютный путь!) вашего файла SQLite. К сожалению, вы не можете просто использовать относительный путь, который работает без изменений во время разработки и во время выполнения (<i>это все еще верно? Разве вы не можете просто скопировать файл db в сценарий оболочки после сборки или создать символическую ссылку на него? </i>). Вы должны убедиться, что при запуске приложения правильный путь к файлу всегда устанавливается программно, независимо от того, что он содержал во время разработки.
79+
80+> **Note:** Чтобы установить полный путь к библиотеке (если вы поместите свою sqlite dll/so/dylib в место, где ОС ее не найдет, например каталог приложения в Linux/OSX), вы можете установить «SQLiteLibraryName» свойство (ДО того, как будет установлено какое-либо соединение, например, в событии OnCreate главной формы)
81+
82+, например:
83+
84+``` pascal
85+SQLiteLibraryName:='./sqlite3.so';
86+```
87+
88+<b>TSQLQuery</b>:
89+
90+- SQL: задайте для него простой запрос выбора для одной из ваших таблиц. Например, если у вас есть таблица 'foo' и вы хотите, чтобы этот набор данных представлял эту таблицу, просто используйте следующие:
91+ ``` SQL
92+ SELECT * FROM foo
93+ ```
94+
95+- Active: установите для него значение True в среде IDE, чтобы проверить, все ли настроено правильно. Это также автоматически активирует транзакцию и объекты подключения. Если вы получаете сообщение об ошибке, то либо DatabaseName соединения неверно, либо запрос SQL неверен. Позже, когда мы закончим добавление полей (см. ниже), снова установим их все в неактивные состояния, мы не хотим, чтобы среда IDE блокировала базу данных SQLite (для одного пользователя!) при тестировании приложения.
96+
97+- *Наверное, не нужно для правильной работы - нужно будет проверить (June 2012)* Теперь мы можем добавить поля в наш TSQLQuery. Пока компоненты все еще активны, щелкните правой кнопкой мыши и «отредактируйте поля ...». Нажмите кнопку «+» и добавьте поля. В нем будут перечислены все поля, возвращенные вашим SQL-запросом. Добавьте все поля, которые вам понадобятся, вы также можете добавить сюда поля поиска; в этом случае просто убедитесь, что вы уже определили все необходимые поля в других наборах данных, прежде чем начинать добавлять поля поиска, которые ссылаются на них. Если в вашей таблице много столбцов, и они вам не нужны, вы можете просто не указывать их, а также сделать свой SQL более конкретным.
98+
99+- В вашем коде вам нужно вызвать SQLQuery.ApplyUpdates и SQLTransaction.Commit, события TSQLQuery.AfterPost и AfterInsert - хорошее место для этого при использовании его с элементами управления с учетом данных, но, конечно, вы также можете отложить эти вызовы на более позднее время. Если вы не вызовете их, база данных не будет обновлена.
100+
101+- "Database is locked" (База данных заблокирована): IDE может по-прежнему блокировать базу данных (SQLite - это база данных для одного пользователя), вы, вероятно, забыли установить компоненты в неактивное состояние и снова отключить их после того, как вы закончили определение всех полей ваших объектов TSQLQuery. Используйте событие OnCreate формы, чтобы задать путь и активировать объекты только во время выполнения. Большинство вещей, которые вы устанавливаете в TSQLQuery из среды IDE, не требуют (а некоторые даже не позволяют), чтобы они были активными во время разработки, единственным исключением является определение полей, в которых он хочет прочитать дизайн таблицы, поэтому неактивность во время разработки должно быть нормальным состоянием.
102+
103+- Все ваши таблицы должны иметь первичный ключ, и вы должны убедиться, что соответствующее поле имеет pfInKey и ничего больше в его PoviderFlags (эти флаги управляют тем, как и где используется поле при автоматическом построении запросов на обновление и удаление).
104+
105+- Если вы используете lookup-поля
106+ - убедитесь, что ProviderFlags для lookup-поля полностью пуст, чтобы он не пытался использовать свое имя в запросе на обновление. Само поле поиска не является полем данных, оно действует только на значение другого поля, соответствующего ключевого поля, и только это ключевое поле будет позже использоваться в запросах на обновление. Вы можете установить ключевое поле как скрытое, потому что обычно вы не хотите видеть его в своей DBGrid, но его необходимо определить.
107+ - LookupCache должен иметь значение True. На момент написания этой статьи по какой-то причине в -lookupполе ничего не отображается (но все равно работает), и, как ни странно, происходит полная противоположность при работе с TSQLite3Dataset или другими компонентами TXXXDataset, здесь должно быть установлено значение False. Я еще не уверен, является ли это предполагаемым поведением или ошибкой.
108+
109+- Обычно для простых таблиц вам не нужно устанавливать какие-либо свойства InsertSQL, UpdateSQL и DeleteSQL, просто оставьте их пустыми. Если у вас правильно установлены ProviderFlags всех ваших полей, он сможет создать необходимый SQL на лету. Подробнее об InsertSQL, UpdateSQL и DeleteSQL см. [[Working With TSQLQuery|Работа с TSQLQuery]].
110+
111+После того, как все вышеперечисленное будет настроено правильно, вы сможете использовать TSQLQuery, как и любой другой TDataset, либо программно манипулируя его данными, либо помещая TDatasouce в форму, подключая его к TSQLQuery, а затем используя контуры данных, такие как TDBGrid и т.п.
112+
113+### Creating a Database
114+
115+Метод [TSQLite3Connection.CreateDB](http://www.freepascal.org/docs-html/fcl/sqldb/tsqlconnection.createdb.html), унаследованный от родительского класса, на самом деле ничего не делает; чтобы создать базу данных, если файл еще не существует, вам просто нужно записать данные таблицы, как в следующем примере:
116+
117+(Код, извлеченный из примера sqlite_encryption_pragma, который поставляется с Lazarus 1.3 и новее)
118+
119+``` pascal
120+var
121+ newFile : Boolean;
122+begin
123+
124+ SQLite3Connection1.Close; // Убедитесь, что соединение закрыто при запуске
125+
126+ try
127+ //Поскольку мы делаем эту базу данных впервые,
128+ // проверяем, существует ли уже файл
129+ newFile := not FileExists(SQLite3Connection1.DatabaseName);
130+
131+ if newFile then
132+ begin
133+ // Создаем базу данных и таблицы
134+ try
135+ SQLite3Connection1.Open;
136+ SQLTransaction1.Active := true;
137+
138+ // Здесь мы настраиваем таблицу с именем "DATA" в новой базе данных.
139+ SQLite3Connection1.ExecuteDirect('CREATE TABLE "DATA"('+
140+ ' "id" Integer NOT NULL PRIMARY KEY AUTOINCREMENT,'+
141+ ' "Current_Time" DateTime NOT NULL,'+
142+ ' "User_Name" Char(128) NOT NULL,'+
143+ ' "Info" Char(128) NOT NULL);');
144+
145+ // Создание индекса на основе идентификатора в таблице "DATA"
146+ SQLite3Connection1.ExecuteDirect('CREATE UNIQUE INDEX "Data_id_idx" ON "DATA"( "id" );');
147+
148+ SQLTransaction1.Commit;
149+
150+ ShowMessage('База данных успешно создана.');
151+ except
152+ ShowMessage('Невозможно создать новую базу данных');
153+ end;
154+ end;
155+ except
156+ ShowMessage('Невозможно проверить, существует ли файл базы данных');
157+ end;
158+ end;
159+```
160+
161+### Создание определяемых пользователем порядка сортировки
162+
163+``` pascal
164+// utf8-callback функция сравнения с учетом регистра
165+function UTF8xCompare(user: pointer; len1: longint; data1: pointer; len2: longint; data2: pointer): longint; cdecl;
166+var S1, S2: AnsiString;
167+begin
168+ SetString(S1, data1, len1);
169+ SetString(S2, data2, len2);
170+ Result := UnicodeCompareStr(UTF8Decode(S1), UTF8Decode(S2));
171+end;
172+
173+// utf8-callback функция сравнения без учета регистра
174+function UTF8xCompare_CI(user: pointer; len1: longint; data1: pointer; len2: longint; data2: pointer): longint; cdecl;
175+var S1, S2: AnsiString;
176+begin
177+ SetString(S1, data1, len1);
178+ SetString(S2, data2, len2);
179+ Result := UnicodeCompareText(UTF8Decode(S1), UTF8Decode(S2));
180+end;
181+
182+// регистрируем порядок сортировки с помощью SQLite3 API (требуется модуль sqlite3dyn):
183+sqlite3_create_collation(SQLite3.Handle, 'UTF8_CI', SQLITE_UTF8, nil, @UTF8xCompare_CI);
184+// или используем метод TSQLite3Connection:
185+CreateCollation('UTF8_CI',1,nil,@UTF8xCompare_CI);
186+
187+// теперь мы можем использовать порядок сортировки без учета регистра в SQL, например:
188+// SELECT * FORM table1 WHERE column1 COLLATE UTF8_CI = 'á'
189+
190+// но это не работает для оператора LIKE
191+// чтобы поддерживать также оператор LIKE, мы должны перегрузить функцию LIKE по умолчанию, используя sqlite3_create_function ()
192+// http://www.sqlite.org/lang_corefunc.html#like
193+```
194+
195+### Создание пользовательских функций (UDF)
196+
197+``` pascal
198+// пример перегрузки функции LOWER() по умолчанию на функцию, предоставляемую пользователем
199+// чтобы запустить эту демку, вы должны добавить модули sqlite3dyn и ctypes в ваше предложение uses
200+// и добавить константу 'SQLITE_DETERMINISTIC' со значением $800
201+
202+procedure UTF8xLower(ctx: psqlite3_context; N: cint; V: ppsqlite3_value); cdecl;
203+var S: AnsiString;
204+begin
205+ SetString(S, sqlite3_value_text(V[0]), sqlite3_value_bytes(V[0]));
206+ S := UTF8Encode(AnsiLowerCase(UTF8Decode(S)));
207+ sqlite3_result_text(ctx, PAnsiChar(S), Length(S), sqlite3_destructor_type(SQLITE_TRANSIENT));
208+end;
209+
210+// регистрируем функцию LOWER() с помощью SQLite3 API (требуется модуль sqlite3dyn):
211+sqlite3_create_function(SQLite3.Handle, 'lower', 1, SQLITE_UTF8 or SQLITE_DETERMINISTIC, nil, @UTF8xLower, nil, nil);
212+```
213+
214+### SQLite3 и даты
215+
216+- SQLite 3 не хранит даты как специальное значение DateTime. Он может хранить их в виде строк, чисел двойной точности или целых чисел - см. [Date and Time Datatype](http://www.sqlite.org/datatype3.html#datetime).
217+- В строках разделителем даты является «-» в соответствии со стандартом SQL/ISO 8601. Таким образом, если вы выполняете INSERT с использованием встроенной функции DATE, она сохранит его как что-то вроде «ГГГГ-ММ-ДД».
218+- Чтение значения DateTime может вызвать проблемы для DataSet, если они хранятся в виде строк: квалификатор .AsDateTime может останавливаться на "строковой дате" SQLite, но это можно преодолеть, используя что-то вроде `strftime(`*`%d/%m/%Y`*`,recdate) AS sqlite3recdate` в вашем операторе SQL SELECT, который заставляет SQLite3 возвращать запись даты в указанном формате (строка формата %d/%m/%d соответствует вашему региональному формату даты, который будет пониматься как .AsDateTime) **==\> Пожалуйста, откройте отчет об ошибке с примером приложения, демонстрирующим проблему, если это так**
219+- При сравнении дат, хранящихся в виде строк (используя, например, функцию BETWEEN), помните, что сравнение всегда будет <b>строковым</b> сравнением и, следовательно, будет зависеть от того, как вы сохранили значение даты.
220+
221+#### Значения по умолчанию для местного времени вместо UTC
222+
223+CURRENT_TIME, CURRENT_DATE и CURRENT_TIMESTAMP возвращают текущую дату и/или время в формате UTC. Для местной даты и/или времени мы можем использовать:
224+
225+` DEFAULT (datetime('now','localtime')) for datetime values formated YYYY-MM-DD HH:MM:SS`\
226+` DEFAULT (date('now','localtime')) for date value formated YYYY-MM-DD`\
227+` DEFAULT (time('now','localtime')) for time value formated HH:MM:SS`
228+
229+### Устранение неполадок SQLDB и SQLite
230+
231+- Имейте в виду, что для поддержки работы времени разработки (поля и т.д.) Lazarus также должен найти sqlite3.dll (прим.перев: положите этот файл в корень IDE рядом с экзешником. Обратите внимание, что разрядность библиотеки должна соответствовать разрядности Лазаруса).
232+- То же самое и с именем файла базы данных. Всегда используйте абсолютный путь, если вы используете компоненты для извлечения, например, имена полей во время разработки. В противном случае IDE создаст в своем каталоге пустой файл. В случае возникновения проблем проверьте, не содержит ли каталог lazarus/ нулевую байтовую копию файла базы данных.
233+- Если у вас есть отношения master/detail, вам необходимо обновлять главный набор данных после каждой вставки, чтобы получить значение для поля внешнего ключа подчиненного набора данных. Это можно сделать в событии AfterPost основного набора данных, вызвав одну из следующих перегруженных процедур:
234+
235+``` pascal
236+interface
237+ procedure RefreshADatasetAfterInsert(pDataSet: TSQLQuery);overload;
238+ procedure RefreshADatasetAfterInsert(pDataSet: TSQLQuery; pKeyField: string);overload;
239+
240+implementation
241+
242+procedure RefreshADatasetAfterInsert(pDataSet: TSQLQuery; pKeyField: string);
243+// Эта процедура обновляет набор данных и помещает курсор на последнюю запись
244+// Используется, если Dataset не гарантирует сортировку набора данных по первичному ключу автоинкремента
245+var
246+ vLastID: Integer;
247+ vUpdateStatus : TUpdateStatus;
248+begin
249+ vUpdateStatus := pDataset.UpdateStatus;
250+ //Получаем последний вставленный ID в базе данных
251+ pDataset.ApplyUpdates;
252+ vLastID:=(pDataSet.DataBase as TSQLite3Connection).GetInsertID;
253+ //Теперь возвращаемся к соответствующей строке
254+ if vUpdateStatus = usInserted then begin
255+ pDataset.Refresh;
256+ //Обновляемся и возвращаемся к соответствующей строке
257+ pDataset.Locate(pKeyField,vLastID,[]);
258+ end;
259+end;
260+
261+procedure RefreshADatasetAfterInsert(pDataSet: TSQLQuery);
262+//Эта процедура обновляет набор данных и помещает курсор на последнюю запись
263+//Используется только в том случае, если DataSet гарантированно отсортирован по первичному ключу с автоинкрементом.
264+var
265+ vLastID: Integer;
266+ vUpdateStatus : TUpdateStatus;
267+begin
268+ vUpdateStatus := pDataset.UpdateStatus;
269+ pDataset.ApplyUpdates;
270+ vLastID:=(pDataSet.DataBase as TSQLite3Connection).GetInsertID;
271+ if vUpdateStatus = usInserted then begin
272+ pDataset.Refresh;
273+ //Опасно!
274+ pDataSet.Last;
275+ end;
276+end;
277+
278+procedure TDataModule1.SQLQuery1AfterPost(DataSet: TDataSet);
279+begin
280+ RefreshADatasetAfterInsert(Dataset as TSQLQuery); //Если ваш набор данных отсортирован по первичному ключу
281+end;
282+
283+procedure TDataModule1.SQLQuery2AfterPost(DataSet: TDataSet);
284+begin
285+ RefreshADatasetAfterInsert(Dataset as TSQLQuery, 'ID'); //если вы не уверены, что набор данных всегда сортируется по первичному ключу
286+end;
287+```
288+
289+### Vacuum и другие операции, которые необходимо выполнять вне транзакции
290+
291+Кажется, что SQLDB всегда требует подключения, но некоторые операции, такие как Pragma и Vacuum, должны Быть сделано вне транзакции. Хитрость заключается в том, чтобы завершить транзакцию, выполнить то, что вы должны, и начать транзакцию еще раз (чтобы не запутать sqldb):
292+
293+``` pascal
294+ // коммит любых ожидающих операций или использование «свежего» соединения sql
295+ Conn.ExecuteDirect('End Transaction'); // Завершение транзакции, начатой SQLdb
296+ Conn.ExecuteDirect('Vacuum');
297+ Conn.ExecuteDirect('Begin Transaction'); //Запуск транзакции для использования SQLdb
298+```
299+
300+## Использование TSQLite3Dataset
301+
302+В этом разделе подробно описано, как использовать компоненты TSQLite2Dataset и TSQLite3Dataset для доступа к базам данных SQlite (от Luiz Américo luizmed(at)oi(dot)com(dot))br
303+
304+#### Требования
305+
306+- Для баз данных sqlite2 (legacy):
307+ - FPC 2.0.0 или выше
308+ - Lazarus 0.9.10 или выше
309+ - SQLite runtime библиотеки 2.8.15 или выше*
310+
311+- Sqlite2 больше не поддерживается, и двоичный файл не может быть найден на сайте sqlite
312+
313+- Для баз данных sqlite3:
314+ - FPC 2.0.2 или выше
315+ - Lazarus 0.9.11 (svn revision 8443) или выше
316+ - sqlite runtime библиотеки 3.2.1 или выше (можно получить с [www.sqlite.org](http://www.sqlite.org))
317+
318+**Перед запуском проекта lazarus убедитесь, что:**
319+
320+- библиотека sqlite либо
321+ - прописана в системной переменной PATH или
322+ - находится в каталоге вывода исполняемых файлов и в каталогах Lazarus (или текущего проекта) - этот параметр может работать только в Windows
323+- в Linux поместите `cmem` в качестве первого модуля в разделе `uses` основной программы
324+ - В Debian, Ubuntu и других подобных Debian дистрибутивах для создания Lazarus IDE необходимо установить пакеты libsqlite-dev/libsqlite3-dev, а не только sqlite/sqlite3 (также относится к OpenSuSe)
325+
326+#### Как использовать (базовое использование)
327+
328+Установить пакет, который находится в каталоге /components/sqlite (см. инструкции [[Install Packages/ru|здесь]]) (прим.перев.: на момент перевода статьи это можно сделать через стандартный установщик пакетов Лазаруса из меню Package(Пакеты) --\> Install/Uninstall Package (Установка/Удаление пакетов) --\> справа в окне Available for installation (Доступные для установки) выбираем sqlite3laz 0.4 --\> ниже жмем кнопку Install Selection (Установить выбранное) --\> жмем в самом низу кнопку Save and rebuild IDE (Сохранить и пересобрать IDE)).
329+
330+Во время разработки установите следующие свойства:
331+
332+- FileName: путь к файлу sqlite \[обязательно\]
333+- TableName: имя таблицы, используемой в операторе sql \[обязательно\]
334+- SQL: оператор выбора SQL \[по желанию\]
335+- SaveOnClose: значение по умолчанию - false, что означает, что изменения не сохраняются. Его можно изменить на true. \[по желанию\]
336+- Active: необходимо установить во время разработки или при запуске программы. \[обязательно\]
337+
338+**Создание Table (Dataset)**
339+
340+Дважды щелкните значок компонента или используйте пункт 'Create Table'(Создать таблицу) во всплывающем меню, которое появляется при нажатии правой кнопки мыши. Будет показан простой редактор таблиц с пояснениями.
341+
342+Вот все типы полей, поддерживаемые TSqliteDataset и TSqlite3Dataset:
343+
344+- Integer
345+- AutoInc
346+- String
347+- Memo
348+- Bool
349+- Float
350+- Word
351+- DateTime
352+- Date
353+- Time
354+- LargeInt
355+- Currency
356+
357+**Получение данных**
358+
359+После создания таблицы или с помощью ранее созданной таблицы откройте набор данных с помощью метода Open. Если свойство SQL не было установлено, будут извлечены все записи из всех полей, то же самое можно получить, если вы зададите SQL следующим образом:
360+
361+``` pascal
362+SQL := 'Select * from TABLENAME';
363+```
364+
365+**Применение изменений к базовому файлу данных**
366+
367+Чтобы использовать функцию ApplyUpdates, набор данных должен содержать по крайней мере одно поле, которое удовлетворяет требованиям для первичного ключа (значения должны быть UNIQUE, а не NULL)
368+
369+Сделать это можно двумя способами:
370+
371+- Установить свойство PrimaryKey на имя поля первичного ключа
372+- Добавить поле AutoInc (это проще, поскольку TSqliteDataSet автоматически обрабатывает его как первичный ключ)
373+
374+Если установлено одно из двух условий, просто вызовите
375+
376+``` pascal
377+ApplyUpdates;
378+```
379+
380+> **Note:** Если заданы оба условия, поле, соответствующее PrimaryKey, используется для применения обновлений.
381+
382+> **Note:** Установка PrimaryKey в поле, которое не является первичным ключом, приведет к потере данных при вызове ApplyUpdates, поэтому перед его использованием убедитесь, что выбранное поле не содержит значений Null и Unique.
383+
384+##### Пример Master/detail
385+
386+Различные примеры отношений master/detail (например, отношения между клиентом и заказами):
387+
388+- общий способ SQLDB для этого с использованием свойства `DataSource`: [[MasterDetail]]
389+- Конкретный пример TSQLite3 с использованием метода `locate`: [[TSqlite3 Master Detail Example|пример TSqlite3 Master Detail]].
390+
391+#### Примечания
392+
393+- Несмотря на то, что TSqliteDataset был протестирован с 10 000 записей и работал нормально, все данные хранятся (прим.перев.: кешируются) в памяти, поэтому не забывайте извлекать только необходимые данные (особенно с полями Memo).
394+- Один и тот же файл данных (свойство Filename) может содержать несколько таблиц/наборов данных.
395+- Несколько наборов данных (разные комбинации полей) могут быть созданы с использованием одной и той же таблицы одновременно
396+- Можно фильтровать данные с помощью операторов WHERE в sql, закрывая и повторно открывая набор данных (или вызывая метод RefetchData). Но в этом случае порядок и количество полей должны оставаться прежними.
397+- Также можно использовать сложные операторы SQL, используя псевдонимы, объединения, представления в нескольких таблицах (помните, что они должны находиться в одном файле данных), но в этом случае ApplyUpdates не будет работать. Если кто-то хочет использовать сложные запросы и применить обновления к файлу данных, напишите мне, и я дам несколько советов, как это сделать.
398+- Установка имени файла в файл данных sqlite, не созданный TSqliteDataset, и его открытие разрешено, но в некоторых полях не будет обнаружен правильный тип поля. Они будут рассматриваться как строковые поля.
399+
400+Общие примеры можно найти в SVN каталоге fpc/fcl-db/src/sqlite.
401+
402+## See also
403+
404+- [[SQLdb Tutorial1]] Учебник по Sqlite
405+- [[SqlDBHowto]] Общая информация о SQLDB
406+- [[Working With TSQLQuery]] Информация о SQLDB's TSQLQuery
407+- [SQLite site](http://www.sqlite.org)
408+- [TSQLConnection](https://www.freepascal.org/docs-html/fcl/sqldb/tsqlconnection.html)
409+
410+---
411+*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