使用 db.select 执行简单 SQL 查询

问题

怎样执行数据库查询?

解决方案

在 web.py 0.3x 和 0.40 版本, 建立数据库大致如下:

  1. db = web.database(dbn="postgres", host="localhost", port=5432, db="mytable", user="db_user", pw="db_password")

成功建立数据库连接后, 可以这样执行查询数据库:

  1. # Select all entries from table `mytable`
  2. results = db.select("mytable")

db.select 支持以下几个关键字参数:

  • vars
  • what
  • where
  • order
  • group
  • limit
  • offset
  • _test

vars

vars 是一个 dict,保存 SQL 查询语句里需要用到的变量,在实际构造 SQL 语句时会被用于替换 WHERE 语句里以 $ 开头的变量。如:

  1. myvars = dict(name="Bob")
  2. # `name=$name` 将被替换为 `name="Bob"`
  3. results = db.select("mytable", vars=myvars, where="name = $name")

what

what 指明要查询的 SQL 字段名。如果省略则默认查询所有字段(即 SELECT * FROM …)。

  1. # 实际执行的 SQL 语句: SELECT id, name FROM mytable
  2. results = db.select("mytable", what="id, name")

where

where 用于指定 SQL 语句里的查询条件, 如:

  1. # 实际执行的 SQL 语句: SELECT id FROM mytable WHERE id > 100
  2. results = db.select("mytable", what=id, where="id > 100")

order

order 指明查询结果要以何种方式排序。

  1. # 实际执行的 SQL 语句: SELECT * FROM mytable ORDER BY post_date DESC
  2. results = db.select("mytable", order="post_date DESC")

group

group 指明以何种方式对查询结果分组统计:

  1. # 实际执行的 SQL 语句: SELECT * FROM mytable GROUP BY color
  2. results = db.select("mytable", group="color")

limit

limit 指明返回多少条结果:

  1. # 实际执行的 SQL 语句: SELECT * FROM mytable LIMIT 10
  2. results = db.select("mytable", limit=10)

offset

offset 指明偏移量,即从第几行开始查询:

  1. # 实际执行的 SQL 语句: SELECT * FROM mytable OFFSET 10
  2. results = db.select("mytable", offset=10)

_test

设置 _test=True 时,db.select 只是构造 SQL 语句,并不实际执行:

  1. # `results` 是一个 string:<sql: 'SELECT * FROM mytable OFFSET 10'>
  2. results = db.select("mytable", offset=10, _test=True)