Я "реализовал" пользовательский geoSearch в моем проекте, используя Prisma и базу данных MySQL:
Вам необходимо иметь возможность программно подключаться к вашей базе данных.
Прежде всего, давайте получимнаш env var :
const host = process.env.MYSQL_ENDPOINT;
const user = process.env.MYSQL_ROOT_USERNAME;
const password = process.env.MYSQL_ROOT_PASSWORD;
const database = process.env.PRISMA_SERVICE + "@" + process.env.PRISMA_STAGE;
Теперь попробуйте подключиться к нашей базе данных, используя пакет обещание-mysql :
let connection;
try {
//Create a connection to the database;
connection = await mysql.createConnection({
host,
user,
password,
database
});
} catch (e) {
console.error(e);
throw new Error("Could not connect to the Database");
}
Этонеобходимо иметь пространственный столбец в вашей таблице, который также должен иметь пространственный индекс .Это можно сделать программно, используя эти (таблица должна быть пустой):
/**
* Add a spatial column to the table, used for geo-searching
* @param {string} tableName name of the table to alter
* @param {string} columnName name of the spatial column
* @param {string} lonColumnName name of the longitude column
* @param {string} latColumnName name of the latitude column
* @param {object} connection connection to the database
* @return {Promise} result of the table alteration
*/
const addSpatialColumn = async (
tableName,
columnName,
lonColumnName,
latColumnName,
connection
) => {
return connection.query(`
ALTER TABLE
${tableName} ADD ${columnName} POINT AS(
ST_POINTFROMTEXT(
CONCAT(
'POINT(',
${lonColumnName},
' ',
${latColumnName},
')'
)
)
) STORED NOT NULL;`);
};
/**
* Add a spatial index to the table
* @param {string} tableName name of the table
* @param {string} columnName name of the column to create an index on
* @param {object} connection connection to the database
* @return {Promise} result of the index creation
*/
const addSpatialIndex = async (tableName, columnName, connection) => {
return connection.query(
`ALTER TABLE ${tableName} ADD SPATIAL INDEX(${columnName});`
);
};
Теперь самое сложное.Поскольку Prisma пока не дает нам ложной информации, вам необходимо определить параметры вашего SQL-запроса самостоятельно .
Затем вы можете выполнить свой запрос, например:
const query = `SELECT ${sqlSelect} FROM ${sqlFrom} WHERE
MBRContains(ST_GeomFromText("${polygon}"), GeoPoint) ${sqlWhere} LIMIT
${toSkip},${batchSize}`;
const selectedRows = await connection.query(query);
Постскриптум: эти фрагменты не являются абстракциями и, следовательно, могут нуждаться в изменениях / улучшениях.Я просто привожу пример решения этой временной проблемы.