github:https://github.com/mouday/PyThink
说下这个pythink
模块的作用
背景:
我们公司的主要使用的后端语言有两种,python和php
而且有一个专门的DBA管理数据库,就是说,这个数据库不是你一个人的,有同组的成员和其他组的成员在使用,好像大部分公司都一样。
Python爬虫部分的业务,主要操作是插入;而PHP业务主要是查询
最开始我使用普通的模块pymysql
,这样每次都要去连接,关闭,很麻烦;
import pymysql
conn = pymysql.Connect(
host="127.0.0.1",
port=3306,
user="root",
passwd="123456",
db="test"
)
cursor = conn.cursor()
rows = cursor.execute("insert into student(name, age, register_date, gender) values ('xiaoming', 23, '2018-12-30', 'M')")
cursor.close()
conn.close()
后来使用了peewee
来管理数据库链接,使用Model来创建数据库(这个时候还没有人管理数据库),简直不要太爽,不写一行SQL语句就实现了表创建,和数据操作;
后来我这边的表太多了,业务发展也规范了,专门有人管理数据库。这样就不能使用Model直接建表,而是要写成sql
语句给数据库管理人员,审核完后再进行建表操作
from peewee import *
# 设置数据库
db = MySQLDatabase("mysql://root:[email protected]:3306/demo")
class BaseModel(Model):
class Meta:
database = db
# 定义数据表
class User(BaseModel):
name = CharField()
User.create(name="Tom")
在这种情况下,如果使用Model就必须先写sql建表
,再把所有字段定义写出来才可以使用,如果涉及的表字段少还好,有时候涉及100多个字段(真的有过),那光是定义就一上午,Model的优势反而成了累赘,心累;
于是我开始不用Model了,直接使用peewee
提供execute_sql
这样我们又回到了原生sql的时代;
db.execute_sql("insert into student(name, age) values ('Tom', 24)")
一般情况下,会将sql执行的语句和结果封装到一个函数中。写的多了,发现很多重复代码,除了sql不一样以外,其他格式基本一致。于是需要抽象出来,将相同代码抽象封装,以便复用。
于是pythink
出现了,结合了peewee
的操作方式,也保留了一部分原生sql
的格式,比如,增(insert)、删(delete)、改(update)、查(select)基本保留了sql的关键字,不需要额外记忆和区别,而且可以把对表的操作单独卸载model中,进行统一管理,也可以重写基类的方法,自己实现自己的业务逻辑(不建议,建议取一个不一样的函数名字)。
一起感受下其如丝般顺滑的操作
安装
pip install pythink
代码示例
数据库demo 中有 一个表student,对其进行数据查询
mysql> use demo;
mysql> select * from student limit 2;
+----+------+------+------+
| id | name | age | sex |
+----+------+------+------+
| 1 | Tom | 24 | 1 |
| 2 | jack | 23 | 0 |
+----+------+------+------+
2 rows in set (0.00 sec)
# -*- coding: utf-8 -*-
from pythink import ThinkModel
from playhouse.db_url import connect
# 1、使用peewee进行数据库连接
db = connect("mysql://root:[email protected]:3306/demo")
# 2、继承 ThinkModel 实现自己的类
class StudentThinkModel(ThinkModel):
table_name = "student"
database = db
# 3、数据插入insert
data = {
"name": "Tom",
"age": 24
}
result = StudentThinkModel.insert(data)
print(result)
# 1
# 4、删除
result = StudentThinkModel.delete(13)
print(result)
# 1
# 5、修改
data = {
"name": "Tom",
"age": 24
}
result = StudentThinkModel.update(1, data)
print(result)
# 1
# 6、查询数据库中 id=1 的 name 和 age 两个字段
students = StudentThinkModel.select(fields=["name", "age"], where="id=1", limit=1)
for student in students:
print("name: {}".format(student.name))
print("age: {}".format(student.age))
"""
name: Tom
age: 24
"""
# 7、记得关闭数据库连接
db.close()
当然还可以进行各种增删改查,不过还处于测试阶段,如果用于正式项目还要注意其执行的结果