使用flask-sqlalchemy创建表
# python3 , python2, MySQLdb
from datetime import datetime
import time
import pymysql
# 关于数据库操作的文件
from flask_bootstrap import Bootstrap
from flask_sqlalchemy import SQLAlchemy
from flask import Flask
from sqlalchemy import desc
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:[email protected]/User'
# SQLAlchemy 将会追踪对象的修改并且发送信号。
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)
app.config['SECRET_KEY'] = 'westos'
boostrap = Bootstrap(app)
# 默认情况下创建一个表, 表名为类名; 如果指定了__tablename__, 那么表名为你指定的名称;
class Student(db.Model):
__tablename__ = "students"
# sid: 表头的一列, db.SMALLINT代表存储的数据类型, primary_key(主键), 数据是唯一的;
sid = db.Column(db.SMALLINT, primary_key=True)
sname = db.Column(db.String(50))
sage = db.Column(db.SMALLINT)
# 实现一对多(Role(1): User(n))的关系
# - 多的一端写外键
# - 少的一端写反向引用
class User(db.Model):
# autoincrement=True自增
id = db.Column(db.Integer, autoincrement=True, primary_key=True)
# unique=True, name的值不能重复, 是唯一的;
name = db.Column(db.String(50), unique=True)
# 长度为100, 是因为网站密码一般会加密;
passwd = db.Column(db.String(100))
# 指定用户注册/创建的时间,
# default, 指定默认值, datetime.now()获取当前时间;
# 用户注册时间为当前时间;
add_time = db.Column(db.DateTime, default=datetime.now())
gender = db.Column(db.Boolean, default=True)
# 用户的角色id,不能随便写, 必须要关联其他的数据库表(role) --- 外键
role_id = db.Column(db.INTEGER, db.ForeignKey('role.id'))
def __repr__(self):
return '<User:%s>' %(self.name)
# 用户角色表
class Role(db.Model):
# autoincrement=True自增
id = db.Column(db.Integer, autoincrement=True, primary_key=True)
# unique=True, name的值不能重复, 是唯一的;
name = db.Column(db.String(50), unique=True)
# Role表中的users属性与User表关联, 并且User这个表中可以由role这个对象属性;
users = db.relationship('User',backref='role')
# 对象的字符串显示, 方便查询时使用
def __repr__(self):
return "<Role:%s>" %(self.name)
# 1. 创建定义的表结构
# db.create_all()
# 2. 删除定义的表结构
# db.drop_all()


向表中添加信息
# 3. *****************往表中插入数据;***************************
# 向数据库插入数据分为三个步骤:
# 创建Python对象
# 把它添加到会话
# 提交会话
#
# # 1). 创建用户角色;
role1 = Role(name="超级会员")
role2 = Role(name="会员")
db.session.add(role1)
db.session.add(role2)
db.session.commit()

# # 2). 添加100个用户,其中50个为超级会员, 50个为会员;
for i in range(50):
u = User(name='westos%s' %(i), passwd='westos', role_id=1)
db.session.add(u)
db.session.commit()
for i in range(50):
u = User(name='redhat%s' % (i), passwd='redhat', role_id=2)
db.session.add(u)
db.session.commit()

查询表中数据
# # 4. 查询所有数据
print(Role.query.all())
print(User.query.all())

# # 5. 根据条件查询数据(筛选数据(filter_by)); slect * from table where xxx=xxx;
print(User.query.filter_by(role_id=1).all())
print(User.query.filter_by(role_id=2).all())

# 通过这种方式可以查看原生的sql语句
user = User.query.filter(User.role_id==1)
print(user)
# 8. 对于查询的信息进行显示限制;
users = User.query.filter_by(role_id=1).limit(5).all()
print(users, len(users), end='\n')
# 9. 对于查询的信息进行排序输出(默认情况由小到大进行排序), 如果想要由大到小: desc(User.add_time);
users = User.query.filter_by(role_id=1).order_by(desc(User.add_time)).all()
print(users)
# 10. 多个过滤函数加一个显示函数:
users = User.query.filter_by(role_id=1).order_by(desc(User.add_time)).limit(5).all()
print(users)

# # offset指定偏移量, limit 指定输出数量, 类似于切片操作;
# # 1 2 3 4 5 6 7 8 9
# # limit(5): 1 2 3 4 5
# # limit(5).offset(2): 3 4 5 6 7
users = User.query.filter_by(role_id=1).order_by(desc(User.add_time)).limit(5).offset(2).all()
print(users)
# 切片操作li[2:7]
users = User.query.filter_by(role_id=1).order_by(desc(User.add_time)).slice(2,7).all()
print(users)
count = User.query.filter_by(role_id=1).order_by(desc(User.add_time)).slice(2, 7).count()
print(count)

# 11. 分页:第一个参数代表显示第几页的数据, 第二个参数代表每页显示多少条数据;
users = User.query.paginate(1, 5)
print(users.items)
users = User.query.paginate(2, 5)
print(users.items)

显示关联数据库信息
u = User.query.filter_by(name='westos0').first()
print(u.name, u.passwd, u.add_time, u.role_id, u.role, u.role.id, u.role.name)

对指定的内容进行更新
# # 6. 对于找到的内容进行更新;
u = User.query.filter_by(name='westos0').first()
print(u)
u.passwd = '123456'
db.session.add(u)
db.session.commit()
