dolfijn3000 Ответов: 1

Heroku postgres error: запрос должен быть массивом при выборе данных


так что им делать dscord бот и я использовал SQLite, но потому что ему узла (на Heroku) я не могла использовать это. Тэй сказал что мне нужно использовать postgres поэтому я обновил свой код для использования но я не могу заставить его работать для создания моей таблицы я использую этот код
client.query('CREATE TABLE users(name text, money bigint);', (err, res) => {
  if (err) throw err;
  for (let row of res.rows) {
    console.log(JSON.stringify(row));
  }
  client.end();
});


это прекрасно работает, таблица создана.
затем для insertinf данных я использую это:
client.query(`INSERT INTO users(name,money) SELECT ${message.author.id},0 WHERE NOT EXISTS(SELECT 1 FROM users WHERE name = '${message.author.id}'); `, (err, res) => {
        if (err) throw err;
        message.reply(`inserted data`);

    });

это тоже работает, я думаю.
но потом, когда я захотел получить данные с помощью:
client.query(`SELECT * FROM users WHERE name = ?`, id,(err, row) => {
			if(err) throw err;
			console.log(id);
  			if (!row) return message.reply(`${name} has no money`);
  			
 	 		message.reply(`${name} has ${row.money} money`);
  		
		});


я получаю эту ошибку:
G:\dolphin casino\cmds\money.js:17
                        if(err) throw err;
                                ^

Error: Query values must be an array
    at Query.submit (G:\dolphin casino\node_modules\pg\lib\query.js:156:17)
    at Client._pulseQueryQueue (G:\dolphin casino\node_modules\pg\lib\client.js:356:24)
    at Client.query (G:\dolphin casino\node_modules\pg\lib\client.js:393:8)
    at Object.module.exports.run (G:\dolphin casino\cmds\money.js:16:10)
    at Client.bot.on.message (G:\dolphin casino\bot.js:80:14)
    at emitOne (events.js:96:13)
    at Client.emit (events.js:188:7)
    at MessageCreateHandler.handle (G:\dolphin casino\node_modules\discord.js\src\client\websocket\packets\handlers\MessageCreate.js:9:34)
    at WebSocketPacketManager.handle (G:\dolphin casino\node_modules\discord.js\src\client\websocket\packets\WebSocketPacketManager.js:103:65)
    at WebSocketConnection.onPacket (G:\dolphin casino\node_modules\discord.js\src\client\websocket\WebSocketConnection.js:333:35)


что странно, потому что столбец name-это текст, а не массив.

кто-нибудь знает, что происходит ?

Что я уже пробовал:

поиск в интернете. но я так и не нашел решения.

1 Ответов

Рейтинг:
0

Jochen Arndt

При использовании заполнителей, как в вашем SELECT команда вы должны передать значения в виде массива (заключенного в квадратные скобки):

client.query('SELECT * FROM users WHERE name = ?', [id], (err, row) => {

[РЕДАКТИРОВАТЬ]
Цитата:
теперь я получаю синтаксическую ошибку
Результирующий объект возвращается в row это массив объектов строк. Предполагая, что у вас нет нескольких наборов записей с одинаковым именем, вы можете получить доступ к первому результату:
if (row.rowCount == 1) {
    message.reply(`${id} has ${row.rows[0]['money']} money`);
}
else if (row.rowCount == 0) {
    message.reply(`${id} not found`);
}
[/РЕДАКТИРОВАТЬ]


dolfijn3000

теперь я получаю синтаксическую ошибку

G:\dolphin казино\cmds\money.js:17
если(грешат) бросить ошибаться;
^

ошибка: синтаксическая ошибка в конце ввода
при соединении.Парс (G:\dolphin casino\node_modules\pg\lib\connection.js:545:11)
при подключении.parseMessage (G:\dolphin casino\node_modules\pg\lib\connection.js:370:19)
в TLSSocket.<anonymous> (G:\dolphin casino\node_modules\pg\lib\connection.js:113:22)
at emitOne (events.js:96:13)
at TLSSocket.emit (events.js:188:7)
в readableAddChunk (_stream_readable.js:176:18)
в Тлссокете.Readable.push (_stream_readable.js:134:10)
at TLSWrap.onread (net.js:551:20)

Jochen Arndt

Я могу только догадываться, что ${name} должен быть id или ${row.name}.

Если это тоже не удается, проверьте документацию используемого клиента MySQL о том, как получить доступ к данным результата запроса.

dolfijn3000

самое странное, что он действительно работал с sqlite

dolfijn3000

и нет никаких документов об этом, которые я могу найти

Jochen Arndt

Откуда у вас взялся клиентский модуль или каково его точное название?

dolfijn3000

я взял его из статьи в heroku и использовал node.js установка.
https://devcenter.heroku.com/articles/heroku-postgresql

Jochen Arndt

Смотрите мой обновленный ответ

dolfijn3000

но мне не нужна первая строка мне нужна строка где имя равно id

Jochen Arndt

Запрос SELECT может возвращать любое количество строк. Это может быть none, one (например, при использовании предложения WHERE для уникального поля) или даже все строки при использовании предложения no WHERE.

Поэтому результат всегда возвращается в виде массива строк, где член rowCount сообщает вам, сколько совпадающих строк было возвращено.

Если имя является уникальным полем (то есть: не может существовать в нескольких строках), вы получите число строк, равное нулю или одному возвращенному (не найдено / найдено).

Но вы все равно должны получить доступ к строке по индексу, чтобы получить значения полей.

Чтобы закрепить это: когда идентификатор был найден (и является уникальным), первая строка-это та, которая вам нужна.

dolfijn3000

хорошо но это не поможет мне пройти мимо синтаксической ошибки

dolfijn3000

Ок, понял прошлые ошибки и это сработало, спасибо

Jochen Arndt

Было бы неплохо выяснить, где возникает синтаксическая ошибка.

Закомментируйте все строки, используя переменную row.
Когда ошибка все еще существует, это синтаксис запроса.

Если нет, то он, вероятно, обращается к переменной строки. Затем попробуйте сначала, если row.rowCount работает. Если да, то это массив.

dolfijn3000

мне это было нужно ? чтобы изменение в $1

Jochen Arndt

ОК. Это отличается от большинства реализаций SQL-клиента и еще раз показывает, насколько важна правильная документация (и ее чтение).

dolfijn3000

я не получил его из документации я просто перешел по множеству ссылок когда гуглил его и нашел кого то кто почти пытался сделать то же самое что и я и там они сказали это ? должно быть 1 доллар