Поддерживает ли призма запросы GeoSpatial - PullRequest
0 голосов
/ 24 июня 2018

Я обнаружил, что вы используете MySQL и PostgreSQL на данный момент, и они поддерживают геопространственные типы, как я могу реализовать геопространственные запросы к моей призме.

Допустим, я хочу, чтобы все события проходили поблизости от Нью-Йорка?

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Я "реализовал" пользовательский 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);

Постскриптум: эти фрагменты не являются абстракциями и, следовательно, могут нуждаться в изменениях / улучшениях.Я просто привожу пример решения этой временной проблемы.

0 голосов
/ 24 июня 2018

Географические запросы в настоящее время не поддерживаются Prisma.Вы можете использовать Prisma для большинства ваших запросов и запрашивать базовую базу данных непосредственно для геопространственных запросов.

Следуйте этому запросу, чтобы получать уведомления о доступности этой функции: https://github.com/prismagraphql/prisma/issues/28

...