我司手写复杂 SQL,但也不至于连 insert into 也是手写,对数据库操作有简单封装,主要是对结果进行封装:获取一行、获取一列、获取某行的某列、执行任意 SQL,如果有特别需要 insert into 也是手写,不使用 ORM,这样很直观,心里有底吧。
对结果简单封装后用起来和 ORM 差不多,比如获取一个订单:
```python
purchase = db().get('SELECT * FROM purchase WHERE id=%(purchase_id)s', purchase_id=123)
print(purchase.shopper_id)
print(purchase.sales_channel_id)
```
等等读取操作和用 object 的感觉一样,但如果要更新 purchase 则需要写 SQL:
```
db().execute('UPDATE purchase SET processed_at=CURRENT_TIMESTAMP WHERE id=%(purchase_id)s', purchase_id=123)
```
获取一些订单:
purchases = db().list('SELECT * FROM purchase WHERE created_at>=CURRENT_DATE')
for purchase in purchases:
print(
purchase.id)
获取订单某个字段:
shopper_id = db().get_scalar('SELECT shopper_id FROM purchase WHERE id=%(purchase_id)s', purchase_id=123)
获取订单 ids:
purchase_ids = db().list_scalar('SELECT id FROM purchase WHERE created_at>=CURRENT_DATE')
对数据库的变动写 migration 脚本,按顺序部署时应用到数据库中。
开发环境中模块对表的读写有管理,不是某个模块想写哪就写哪,想读谁就读谁,但这个在生产环境不检查。