系列文章入口

《Python3编程实战Tetris机器人》

设计思路

我们通用的ORM,基本模式都是想要脱离数据库的,几乎都在编程语言层面建立模型,由程序去与数据库打交道。虽然脱离了数据库的具体操作,但我们要建立各种模型文档,用代码去写表之间的关系等等操作,让初学者一时如坠云雾。我的做法是把逻辑加入到Python的字典中,程序将对象自动映射成为标准的SQL查询语句。只要我们理解了标准的SQL语言,我们就能够完成数据库查询操作。

智能查询方式设计

page, size, sort, 分页排序

查询示例:

dao = BaseDao()
rs = dao.select("users",{"page": 1, "size":10, "sort":"age desc"})
print(rs)

生成sql:   SELECT * FROM users  ORDER BY age desc LIMIT 0,10

search, 模糊查询切换参数,不提供时为精确匹配

提供字段查询的精确匹配与模糊匹配的切换。
```
dao = BaseDao()
rs = dao.select("users",{"username": "john", "password":"123", "search":"1"})
print(rs)

生成sql:   SELECT * FROM users  WHERE username like '%john%'  and password like '%123%'
```

ins, lks, ors

这是最重要的三种查询方式,如何找出它们之间的共同点,减少冗余代码是关键。

  • ins, 数据库表单字段in查询,一字段对多个值,例:
    查询示例:

    dao = BaseDao()
    rs = dao.select("users",{"ins":["age", 11,22,26]})
    print(rs)
    
    生成sql:   SELECT * FROM users  WHERE age in ( 11,22,26 )
  • ors, 数据库表多字段精确查询,or连接,多个字段对多个值,例:
    查询示例:

    dao = BaseDao()
    rs = dao.select("users",{"ors":["age", 11,26]})
    print(rs)
    
    生成sql:   SELECT * FROM users  WHERE  ( age = 11  or age = 26 )
  • lks, 数据库表多字段模糊查询,or连接,多个字段对多个值,例:
    查询示例:

    dao = BaseDao()
    rs = dao.select("users",{"lks":["username", "john","password","123"]})
    print(rs)
    
    生成sql:   SELECT * FROM users  WHERE  ( username like '%john%'  or password like '%123%'  )

count, sum

这两个统计求和,处理方式也类似,查询时一般要配合group与fields使用。

  • count, 数据库查询函数count,行统计,例:
    查询示例:

    dao = BaseDao()
    rs = dao.select("users",{"count":["1", "total"]})
    print(rs)
    
    生成sql:   SELECT *,count(1) as total  FROM users
  • sum, 数据库查询函数sum,字段求和,例:
    查询示例:

    dao = BaseDao()
    rs = dao.select("users",{"sum":["age", "ageSum"]})
    print(rs)
    
    生成sql:   SELECT username,sum(age) as ageSum  FROM users

group, 数据库分组函数group,例:

查询示例:

dao = BaseDao()
rs = dao.select("users",{"group":"age"})
print(rs)

生成sql:   SELECT * FROM users  GROUP BY age

不等操作符查询支持

支持的不等操作符有:>, >=, <, <=, <>, =;逗号符为分隔符,一个字段支持一或二个操作。
特殊处:使用"="可以使某个字段跳过search影响,让模糊匹配与精确匹配同时出现在一个查询语句中

  • 一个字段一个操作,示例:
    查询示例:

    dao = BaseDao()
    rs = dao.select("users",{"age":">,10"})
    print(rs)
    
    生成sql:   SELECT * FROM users  WHERE age> 10
  • 一个字段二个操作,示例:
    查询示例:

    dao = BaseDao()
    rs = dao.select("users",{"age":">=,10,<=33"})
    print(rs)
    
    生成sql:   SELECT * FROM users  WHERE age>= 10 and age<= 33
  • 使用"="去除字段的search影响,示例:
    查询示例:

    dao = BaseDao()
    rs = dao.select("users",{"age":"==,18","username":"john","search":"1"})
    print(rs)
    
    生成sql:   SELECT * FROM users  WHERE age= 18  and username like '%john%'

项目地址

https://gitee.com/zhoutk/ptetris
或
https://github.com/zhoutk/ptetris

运行方法

1. install python3, git
2. git clone https://gitee.com/zhoutk/ptetris (or download and unzip source code)
3. cd ptetris
4. python3 tetris

This project surpport windows, linux, macOs

on linux, you must install tkinter first, use this command:
sudo apt install python3-tk

相关项目

已经实现了C++版,项目地址:

https://gitee.com/zhoutk/qtetris
03-05 23:37