Страницы

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

среда, 22 января 2020 г.

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

#delphi #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, выполнить аналогичный запрос, с одновременной выборкой из этих двух
таблиц? Если да, то как? 
    


Ответы

Ответ 1



Отвечу, в итоге, сам. Можно, и не одним способом, хотя все они отличаются инструментами реализации, а не подходом. Я испробовал 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 db1;'; 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-сервера и инструкций, как обновлять базы.

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

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