Страницы

Поиск по вопросам

вторник, 12 марта 2019 г.

Можно ли, используя SQLite, обращаться к таблицам из разных файлов?

Используя MySQL, я могу обращаться к таблицам из разных схем. Например, работая с MySQL в Delphi через ADO, несмотря на то, что я явно задаю схему по умолчанию (в данном случае - dna_homo_2015may):
var ADO1:TADOConnection;
<...> ADO1.ConnectionString:='Provider=MSDASQL.1;Password=password;'+ 'Persist Security Info=True;User ID=user1;Extended Properties="Driver=MySQL ODBC 5.3 ANSI Driver;'+ 'SERVER=localhost;UID=user1;PWD=password;DATABASE=dna_homo_2015may;'+ 'PORT=3306;COLUMN_SIZE_S32=1"';
я могу обращаться к таблицам из нескольких схем, указывая их имена полностью:
Query:='select A.*, B.`id`, B.`name`'+ 'from `dna_homo_2015may`.`temp_pos` A, `dna_homo_2016june`.`genes_list` B'+ 'where <...>';
Могу я, используя SQLite и имея две таблицы table1 в файле base1.sdb и table2 в файле base2.sdb, выполнить аналогичный запрос, с одновременной выборкой из этих двух таблиц? Если да, то как?


Ответ

Отвечу, в итоге, сам. Можно, и не одним способом, хотя все они отличаются инструментами реализации, а не подходом.
Я испробовал ADO, FireDAC, объектный враппер, непосредственную работу с SQLite3.DLL и даже триальные компоненты от DevArt. Скажу сразу - через ADO использовать два разных файла в качестве поставщиков таблиц не получится. У меня, по крайней мере, так и не получилось. Все остальные инструменты более или менее работают. Вся соль заключалась в том, что несмотря на начальное обращение к файлу таблицы (привожу пример с использованием враппера)
s:='P:\SQLLite_DBs\hg38-genes.sdb.db'; base:=TSQLiteDatabase.Create(s);
с последующим аттачем второй базы
s:= 'attach `P:\SQLLite_DBs\hg38-repeats.sdb.db` as db2;'; base.ExecSQL(s);
ещё раз инициализировать первую таблицу, уже как db1:
s:= 'attach `P:\SQLLite_DBs\hg38-genes.sdb.db` as db2;'; base.ExecSQL(s);
Всё. Теперь можно смело обращаться к разным таблицам из разных файлов:
s:='select b.id from db1.`genes-g38-201505` a, db2.`repeats-g38` b where a.`chr` = b.`chr`;'; tb:=base.GetTable(s);
Чтобы обращаться к таблицам из разных файлов. То же самое и с остальными способами работы с SQLite.
Однако, провозившись несколько вечеров с SQLite, я понял, что придётся отказаться от её использования: несмотря на все ухищрения, она уступает в скорости MySQL и не может работать с огромными объёмами данных на уровне геномов. Особенно это касается работы через враппер - он писался не для работы в 64-битном режиме.
А жаль: хотелось бы избавиться от обязательного наличия MySQL-сервера и инструкций, как обновлять базы.

Комментариев нет:

Отправить комментарий