微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

flask学习第五天数据库相关操作

连接数据库(MysqL)得语句: 语法:MysqL+pyMysqL://用户名密码@ip:端口/数据库

增删改查小练习

from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker
# 连接数据库
# 地址
from sqlalchemy.ext.declarative import declarative_base

HOSTNAME = '127.0.0.1'
# 数据库名字
DATABASE = 'iloveyou'
# 端口
PORT = 3306
# 用户名密码
USERNAME = 'root'
PASSWORD = '123456'

DB_URL = f'MysqL+pyMysqL://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}'

engine = create_engine(DB_URL)

# 都要继承这个函数生成的基类
# 创建基类
Base = declarative_base(engine)


# 创建类
class Dj(Base):
    __tablename__ = 'dj'
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(225), nullable=False)
    content = Column(String(225), nullable=False)
    gender = Column(Integer, nullable=False, default=1, comment='1为男, 2为女')

    # 魔术方法
    def __str__(self):
        return f'name:{self.name},contentL{self.content},gender:{self.gender}'


# 模型映射到数据库中
# Base.Metadata.create_all()

# 和游标感觉差不多
Session = sessionmaker(bind=engine)
session = Session()


# 增
def add_data():
    article = Dj(name='python', content='人生苦短,我用python', gender=1)
    session.add_all([article])
    session.commit()


# 查
def select_data():
    # 查询第一条数据
    data = session.query(Dj).first()
    print(data)
    # get更好
    data = session.query(Dj).get(1)
    print(data)
    print('****************')
    data = session.query(Dj).all()
    for item in data:
        print(item)
    # filter条件查询
    print('-----------------')
    data = session.query(Dj).filter(Dj.name == 'java').all()
    for item in data:
        print(item)
    # filter_by
    print('-----------------')
    data = session.query(Dj).filter_by(name='python').all()
    for item in data:
        print(item)


# 修改
def update_data():
    data = session.query(Dj).first()
    data.name = 'c++'
    session.commit()


# 删除
def delete_data():
    data = session.query(Dj).first()
    session.delete(data)
    session.commit()


if __name__ == '__main__':
    # add_data()
    # select_data()
    # update_data()
    delete_data()

运用的一些数据类型和约束

"""
Integer:整形。
Float:浮点类型。
Boolean:传递True/False进去。
DECIMAL:定点类型。    # (number, 精度)
enum:枚举类型。
Date:传递datetime.date()进去。
DateTime:传递datetime.datetime()进去。
Time:传递datetime.time()进去。
String:字符类型,使用时需要指定长度,区别于Text类型。
Text:文本类型。
LONGTEXT:长文本类型。
"""
"""
高级查询
imit、offset和切片
• limit:可以限制每次查询的时候只查询几条数据。
• offset:可以限制查找数据的时候过滤掉前面多少条。
• 切片:可以对Query对象使用切片操作,来获取想要的数据。
1.order_by:可以指定根据这个表中的某个字段进行排序,如果在前面加了一个-,代表的是降序排序。
2.group_by根据某个字段进行分组。比如想要根据性别进行分组,来统计每个分组分别有多少人
3.having是对查找结果进一步过滤。比如只想要看未成年人的数量,那么可以首先对年龄进行分组统计人数,然后再对分组进行having过滤。
"""
'''
• default:认值。
• nullable:是否可空。
• primary_key:是否为主键。
• unique:是否唯一。
• autoincrement:是否自动增长。
• onupdate:更新的时候执行的函数。
• name:该属性数据库中的字段映射
'''

重头戏来了 Flask-sqlAlchemy插件
Flask-sqlAlchemy插件
另外一个框架,叫做Flask-sqlAlchemy,Flask-sqlAlchemy是对sqlAlchemy进行了一个简单的封装,使得我们在flask中使用sqlalchemy更加的简单。可以通过pip install flask-sqlalchemy。
数据库初始化:数据库初始化不再是通过create_engine

from flask import Flask
from flask_sqlalchemy import sqlAlchemy
from constants import DB_URI
app = Flask(__name__)
app.config['sqlALCHEMY_DATABASE_URI'] = DB_URI
db = sqlAlchemy(app)

• ORM类:之前都是通过Base = declarative_base()来初始化一个基类,然后再继承,在Flask-sqlAlchemy中更加简单了

class User(db.Model):
  id = db.Column(db.Integer,primary_key=True)
  username = db.Column(db.String(80),unique=True)
  email = db.Column(db.String(120),unique=True)
  def __repr__(self):
      return '<User %s>' % self.username

• 映射模型到数据库表:使用Flask-sqlAlchemy所有的类都是继承自db.Model,并且所有的Column和数据类型也都成为db的一个属性。但是有个好处是不用写表名了,Flask-sqlAlchemy会自动将类名小写化,然后映射成表名。
写完类模型后,要将模型映射到数据库的表中,使用以下代码创建所有的表:

db.create_all()

添加数据:这时候就可以在数据库中看到已经生成一个user表了。

admin = User('admin','[email protected]')
guest = User('guest','[email protected]')
db.session.add(admin)
db.session.add(guest)
db.session.commit()

添加数据和之前的没有区别,只是session成为了一个db的属性
查询数据:查询数据不再是之前的session.query了,而是将query属性放在了db.Model上,所以查询就是通过Model.query的方式进行查询
users = User.query.all()
删除数据:删除数据跟添加数据类似,只不过session是db的一个属性而已:
db.session.delete(admin)
db.session.commit()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐