我目前正在尝试使用express、node、postgresql 和react 创建一个简单的todo。我试图通过邮递员发布基本描述,但在“-”处或附近出现语法错误
这是我的代码:
//db.js
const Pool = require("pg").Pool;
const pool = new Pool({
user: 'postgres',
host: 'localhost',
port: 5432,
database: 'crud',
password: 'password'
});
module.exports = pool
//index.js
const express = require("express")
const app = express()
const cors = require("cors")
const pool = require("./db")
//middleware
app.use(cors());
app.use(express.json())
//routes
app.post("/todos", async (req, res) => {
try {
const { description } = req.body
const newTodo = await pool.query(
`INSERT INTO todo-list (description) VALUES($1) RETURNING *`,
[description]
);
res.json(newTodo.rows[0])
} catch (err) {
console.error(err.message)
}
})
//get all todos
app.get("/todos", async (req, res) => {
try {
const allTodos = await pool.query("SELECT * FROM todo-list")
res.json(allTodos.rows)
} catch (err) {
console.log(err.message)
}
})
app.listen(8001, () => {
console.log("server is running on port 8001")
})
//.env
DATABASE_URL=postgres://postgres:password@localhost:5432/crud
每:
https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS
SQL 标识符和关键字必须以字母(a-z,也可以是带变音符号的字母和非拉丁字母)或下划线 (_) 开头。标识符或关键字中的后续字符可以是字母、下划线、数字 (0-9) 或美元符号 ($)。请注意,根据 SQL 标准的字母,标识符中不允许使用美元符号,因此它们的使用可能会降低应用程序的可移植性。 SQL 标准不会定义包含数字或以下划线开头或结尾的关键字,因此这种形式的标识符可以安全地防止与标准的未来扩展可能发生的冲突。
再往下:
还有第二种标识符:分隔标识符或带引号的标识符。它是通过将任意字符序列括在双引号 (") 中而形成的。定界标识符始终是标识符,而不是关键字。因此“select”可用于引用名为“select”的列或表,而不带引号的 select 将被视为关键字,因此在需要表名或列名的地方使用时会引发解析错误。该示例可以使用带引号的标识符编写,如下所示:
更新“my_table”设置“a”= 5;
带引号的标识符可以包含任何字符,但代码为零的字符除外。 (要包含双引号,请编写两个双引号。)这允许构造原本不可能的表名或列名,例如包含空格或与符号的表名或列名。长度限制仍然适用。
如果您实际上有一个名为
todo-list
的表,那么在创建它并引用它时需要使用双引号:
create table "todo-list"(id integer);
select * from "todo-list";
id
----
(0 rows)
--Versus what you are seeing.
select * from todo-list;
ERROR: syntax error at or near "-"
我会坚持使用
_
并消除整个双引号问题。