👏

postgreSqlで予約語に注意

2022/12/16に公開

TL;DR

予約語として使用されているもの「user」などのテーブルがあるときはダブルクオーテーションで括らないとSyntaxError出るので気をつけましょう。

QueryFailedError: syntax error at or near "user"

知っていれば一発なのかもしれないけれど、今回初めて遭遇して割とハマったので書いておく。
LaravelとかでCLI経由でマイグレーションファイルを作成するとモデルに対して複数形の名前がついたテーブルが生成されるのであまりタッチしてこなかったけれど、DBMSにも予約語があるのでそれを使うときは注意だよねと言う話。

nestjsのプロジェクトで、テスト書いてる時にDBクリーンアップしたいなと言うことで下記のようなコードを書いていた。

clearDB.ts
const clearDB = async (db: DataSource) => {
	const entities = db.entityMetadatas;
	for (const entity of entities) {
		const repo = await db.getRepository(entity.name);
		await repo.query(
			`TRUNCATE TABLE ${entity.tableName} RESTART IDENTITY CASCADE;`,
		);
	}
};
export default clearDB;

entity一覧で取ってきてそれぞれTruncateしましょうねというだけで、途中まで動いていたのでOKと思っていたら"user"テーブルの部分でSyntax Errorが出ていた。
表題にある通りなので、ダブルクオーテーションで囲ってあげればよし。

clearDB.ts

const clearDB = async (db: DataSource) => {
	const entities = db.entityMetadatas;
	for (const entity of entities) {
		const repo = await db.getRepository(entity.name);
		await repo.query(
			`TRUNCATE TABLE "${entity.tableName}" RESTART IDENTITY CASCADE;`,
		);
	}
};

export default clearDB;

Discussion