Я тестирую экспериментальный вариант, и решил добавить его сюда для полноты.
Хранение запросов в самой БД
То есть я добавил в схему таблицу (которая не имеет отношения к другим таблицам, за исключением мета-уровня, на который эти другие таблицы являются ссылками в хранимых запросах. 1
Насколько хорошо это решает проблему
То, что он делает :
- отделение бизнес-логики от кода.
- позволяет мне довольно легко вырезать и вставлять запросы в тестовую среду (хотя мне приходится вводить значения параметров вручную).
упрощает основную базу кода, так как код в вопросе заменяется на
llaTbl = app.getFromDB('latlongByLocale',app.LocationDropDown.Value);
Вещи, которые не делают:
- Решить проблему «очень длинные строки или неприятный синтаксис». SQL также не имеет хорошего синтаксиса для многострочных строковых литералов.
Как это выглядит?
Пока я создаю базу данных вручную, поэтому queryStore.sql
выглядит так:
-- Experimental idea to store the queries that the app will use on
-- the main database in an auxiliary table inside the database.
CREATE TABLE IF NOT EXISTS qstore ( name TEXT NOT NULL
, nparam INT
, querytext TEXT
, comment TEXT
);
INSERT INTO qstore VALUES ( 'localesInRegion', 1
, "SELECT locale.name as name FROM locale JOIN region ON locale.regionID = region.id WHERE region.name = '%s';"
, ""
);
INSERT INTO qstore VALUES ( 'regionMapData', 1
, "SELECT mapformat, maprights, mapfile FROM region WHERE name = '%s';"
, ""
);
INSERT INTO qstore VALUES ( 'localeMapData', 1
, "SELECT mapformat, maprights, mapfile FROM locale WHERE name = '%s';"
, ""
);
INSERT INTO qstore VALUES ( 'latlongByLocale', 1
, "SELECT latitude, longitude, altitude FROM locale WHERE name = '%s';"
, ""
);
И поиск в matlab опосредуется набором функций, включая
function str = parameterizeQuery(app, qname, varargin)
% Retrieve parameterized query from the DB and perform string
% substitution.
% Get the querytext and expected number of parameters making sure the
% result is non-null
q = sprintf("SELECT nparam, querytext FROM qstore WHERE name = '%s';",qname);
tbl = app.queryDB(q);
if isempty(tbl)
error('storyboard2:parameterizeQuery:nomatch'...
,"No query stroed in the dabase by name '%s'.",qname);
end
nparam = tbl.nparam(1);
querytext = tbl.querytext{1};
if nparam ~= nargin - 2
warning('storyboard2:parameterizeQuery:wrongParameterCount'...
,"The number of parameters passed does not match the number in the query retrieved. Hoping for the best.");
end
% insert parameters
str = sprintf(querytext,varargin{:});
end
function tbl = getFromDB(app, qname, varargin)
% A pass-through convenience function that calls
% parameterizeQuery() and passes the result to
% queryDB()
str = app.parameterizeQuery(qname, varargin{:});
tbl = app.queryDB(str);
end
1 Я немного волнуюсь, что это пример каждой проблемы, которая выглядит так, как будто она соответствует моему молотку, или как-то так.