|
124 | 124 | insert into test.test1 values (null, 1); --ok |
125 | 125 | insert into test.test1 values (1, 2); --ok |
126 | 126 | insert into test.test1 values (2, 1); --error |
127 | | - ``` |
128 | | - |
129 | | -# TODO валидация потенциальных ошибок в SQL запросах |
130 | | - |
131 | | -К валидатору схемы БД это не относится. Собираю на будущее для другого валидатора. |
132 | | - |
133 | | -1) Вместо `NOT IN(...)` [лучше](https://github.com/rin-nas/postgresql-patterns-library/blob/master/README.md#%D0%9F%D0%BE%D1%87%D0%B5%D0%BC%D1%83-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81-%D1%81-%D0%BF%D0%BE%D0%B4%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%BC-%D0%B2-NOT-IN-%D0%B2%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%89%D0%B0%D0%B5%D1%82-0-%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B5%D0%B9) использовать `NOT EXISTS(...)` |
134 | | - |
135 | | -2) Возможные ошибки с `timestamp[tz]` в границах значений. |
136 | | - |
137 | | -Неправильно: |
138 | | -```sql |
139 | | -SELECT sum(amount) |
140 | | -FROM transactions |
141 | | -WHERE transaction_timestamp |
142 | | -BETWEEN ('2023年02月05日 00:00' AND '2023年02月06日 00:00'); |
143 | | -``` |
144 | | - |
145 | | -Правильно: |
146 | | -```sql |
147 | | -SELECT sum(amount) |
148 | | -FROM transactions |
149 | | -WHERE transaction_timestamp >= '2023年02月05日 00:00' |
150 | | -AND transaction_timestamp < '2023年02月06日 00:00'; |
151 | | -``` |
152 | | - |
153 | | -3) Несколько DDL запросов для одного объекта БД лучше объединять в 1 запрос, если позволяет синтаксис. |
154 | | -4) Несколько DDL запросов для разных объектов БД лучше собирать в группу. Т.е. д.б. группа из DDL запросов и группа из DML запросов. |
155 | | -5) Группу из DDL запросов лучше размещать после группы из DML запросов, так будет меньше длительность эксклюзивной блокировки таблиц. |
156 | | -6) Длительность выполнения группы DDL запросов д.б. < 3 секунд. |
157 | | -7) Обнаруживать звёздочку в месте перечисления колонок в SELECT запросе, рекомендовать её заменить на явное перечисление колонок |
158 | | -8) Если в запросе присутствует `LIMIT` и `OFFSET`, но отсутствует `ORDER BY`, то рекомендовать добавить его. |
159 | | -9) Запретить `UPDATE` запросы без `WHERE`, т.к. он блокирует все строки таблицы. При одновременном выполнении этого запроса в разных транзакциях возникают взаимоблокировки. |
160 | | - |
161 | | -# Ссылки |
162 | | - |
163 | | -* https://fosdem.org/2023/schedule/event/postgresql_dont_do_this/attachments/slides/5948/export/events/attachments/postgresql_dont_do_this/slides/5948/DontDoThis.pdf |
| 127 | + ``` |
0 commit comments