첫 쿼리
테이블을 만들고 데이터를 저장한 뒤 조회하는 기본 과정을 안내합니다.
테이블 만들기
migrations/0001_init.sql 파일을 만드세요.
create table posts (
id bigserial primary key,
title text not null,
created_at timestamptz not null default now()
);마이그레이션을 적용합니다.
runlot pg migrate워커에서 데이터 사용하기
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const url = new URL(request.url);
if (request.method === "POST" && url.pathname === "/posts") {
const { title } = (await request.json()) as { title: string };
const rows = await env.db.exec(
"insert into posts (title) values ($1) returning id, title",
[title],
);
return Response.json(rows[0], { status: 201 });
}
const rows = await env.db.exec(
"select id, title, created_at from posts order by id desc limit 20",
);
return Response.json(rows);
},
};runlot deploy동작 확인
curl -X POST https://my-app.me.runlot.app/posts \
-H 'content-type: application/json' \
-d '{"title":"hello"}'
curl https://my-app.me.runlot.app/postsCLI에서 직접 확인할 수도 있습니다.
runlot pg execute -c "select count(*) from posts"대시보드의 SQL 콘솔
프로젝트의 데이터베이스 탭에 SQL 콘솔 버튼이 있습니다. 누르면 편집기가 열리고 왼쪽에 테이블 목록이 나옵니다. 이름을 누르면 SELECT * FROM … LIMIT 100을 대신 써 줍니다. 실행은 ⌘+Enter 또는 Ctrl+Enter입니다.
데이터베이스에 닿는 길은 psql과 같습니다. 콘솔이 이 프로젝트의 접속 자격을 들고 같은 끝점으로 연결하므로, 와이어에서 참인 것은 여기서도 참입니다. 10초 문장 상한도, 오류도, SQLSTATE도 같습니다.
읽기 전용이 기본값입니다. 켜 두면 문장이 읽기 전용 트랜잭션 안에서 실행되고 성공하든 실패하든 되돌려지므로, 무엇을 쳐도 데이터가 바뀌지 않습니다. 끄면 한 번 확인을 묻고, 그 뒤로는 쓰기가 그대로 반영되며 되돌릴 수 없습니다. 되돌리려면 백업에서 복원해야 합니다.
결과에서 알아 둘 것이 둘 있습니다.
- 최대 500행까지 보여 줍니다. 이 상한은 응답에만 적용되고 여러분의 문장에 붙지 않으므로, 아래에 적힌 행 수는 문장이 실제로 처리한 수 그대로입니다. 나머지는
LIMIT과OFFSET으로 넘겨 가며 보세요. - 값은 글자로 보여 주고,
NULL과 빈 문자열을 다르게 그립니다. 오는 길에 JavaScript 숫자로 바꾸지 않으므로 큰bigint도 자릿수가 그대로 나옵니다.
문장이 거절되면 PostgreSQL이 낸 메시지와 SQLSTATE를 함께 보여 줍니다. 고유 제약 위반의 23505 같은 다섯 글자 코드입니다. PostgreSQL 매뉴얼이 이 코드로 색인되어 있으니, 검색할 값어치가 있는 것은 그 문자열입니다.
문장을 실행하려면 접속 정보를 보는 것과 같은 member 권한이 필요합니다. 콘솔이 그 자격으로 돌기 때문입니다. 쓰기는 조직 감사 로그에 남고, 읽기는 남지 않습니다.
다음 단계
- SQLSTATE에 따라 오류를 처리하려면 tryExec를 참고하세요.
- node-postgres와 비슷한 API를 원하면 @runlot/pg를 사용하세요.
- ORM을 사용하려면 ORM을 참고하세요.