AI Prompt: Postgres SQL Style Guide
How to use
Copy the prompt to a file in your repo.
Use the "include file" feature from your AI tool to include the prompt when chatting with your AI assistant. For example, with GitHub Copilot, use #<filename>
, in Cursor, use @Files
, and in Zed, use /file
.
Prompt
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147---# Specify the following for Cursor rulesdescription: Guidelines for writing Postgres SQLglobs: "**/*.sql"---# Postgres SQL Style Guide## General- Use lowercase for SQL reserved words to maintain consistency and readability.- Employ consistent, descriptive identifiers for tables, columns, and other database objects.- Use white space and indentation to enhance the readability of your code.- Store dates in ISO 8601 format (`yyyy-mm-ddThh:mm:ss.sssss`).- Include comments for complex logic, using '/* ... */' for block comments and '--' for line comments.## Naming Conventions- Avoid SQL reserved words and ensure names are unique and under 63 characters.- Use snake_case for tables and columns.- Prefer plurals for table names- Prefer singular names for columns.## Tables- Avoid prefixes like 'tbl_' and ensure no table name matches any of its column names.- Always add an `id` column of type `identity generated always` unless otherwise specified.- Create all tables in the `public` schema unless otherwise specified.- Always add the schema to SQL queries for clarity.- Always add a comment to describe what the table does. The comment can be up to 1024 characters.## Columns- Use singular names and avoid generic names like 'id'.- For references to foreign tables, use the singular of the table name with the `_id` suffix. For example `user_id` to reference the `users` table- Always use lowercase except in cases involving acronyms or when readability would be enhanced by an exception.#### Examples:```sqlcreate table books ( id bigint generated always as identity primary key, title text not null, author_id bigint references authors (id));comment on table books is 'A list of all the books in the library.';```## Queries- When the query is shorter keep it on just a few lines. As it gets larger start adding newlines for readability- Add spaces for readability.Smaller queries:```sqlselect *from employeeswhere end_date is null;update employeesset end_date = '2023-12-31'where employee_id = 1001;```Larger queries:```sqlselect first_name, last_namefrom employeeswhere start_date between '2021-01-01' and '2021-12-31'and status = 'employed';```### Joins and Subqueries- Format joins and subqueries for clarity, aligning them with related SQL clauses.- Prefer full table names when referencing tables. This helps for readability.```sqlselect employees.employee_name, departments.department_namefrom employeesjoin departments on employees.department_id = departments.department_idwhere employees.start_date > '2022-01-01';```## Aliases- Use meaningful aliases that reflect the data or transformation applied, and always include the 'as' keyword for clarity.```sqlselect count(*) as total_employeesfrom employeeswhere end_date is null;```## Complex queries and CTEs- If a query is extremely complex, prefer a CTE.- Make sure the CTE is clear and linear. Prefer readability over performance.- Add comments to each block.```sqlwith department_employees as ( -- Get all employees and their departments select employees.department_id, employees.first_name, employees.last_name, departments.department_name from employees join departments on employees.department_id = departments.department_id),employee_counts as ( -- Count how many employees in each department select department_name, count(*) as num_employees from department_employees group by department_name)select department_name, num_employeesfrom employee_countsorder by department_name;```