Flask——连接MySQL数据库,增删改查操作,属性常用数据类型

SQLAlchemy

cmd安装

先安装 PyMySQL ,接着安装 SQLAlchemy
在这里插入图片描述
换源安装

连接mysql

创建数据库引擎
dialect+driver://username:password@host:port/database?charset=utf8

  • dialect:使用的数据库类型
  • driver:使用的驱动
  • ?charset=utf8:字符集编码,防止中文乱码
from sqlalchemy import create_engine

HOSTNAME = '127.0.0.1'
DATABASE = 'flask_demo'
PORT = 3306
USERNAME = 'root'
PASSWORD = 'root'
DB_URL = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNAME,PASSWORD,HOSTNAME,PORT,DATABASE)
engine = create_engine(DB_URL)


with engine.connect() as conn:
    # 执行原生SQL语句
    result = conn.execute("select * from students")
    # 遍历所有数据
    for result in results:
        print(result)

如果控制台出现 1366警告 ,那么安装 mysql-connector-python驱动
安装完成后,创建引擎修改为

DB_URL = 'mysql+mysqlconnector://{}:{}@{}:{}/{}'.format(USERNAME,PASSWORD,HOSTNAME,PORT,DATABASE)

SQLAlchemy ORM

ORM,对象关系映射,即Object Relational Mapping的简称,通过ORM框架将编程语言中的对象模型与数据库的关系模型建立映射关系,这样做的目的:简化sql语言操作数据库的繁琐过程(原生sql的编写及拼接等),转而直接使用对象模型来操作数据库做替代

根据类创建对象,对象转换成SQL,执行SQL。
类对应数据库一张表,属性对应表字段,对象对应一条记录。

创建表

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base(engine)

class Person(Base):
    # 创建表结构操作
    # 表名
    __tablename__ = 'demoTable'
    #  字段
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(50), nullable=False)
    gender = Column(Integer, default=0, comment="1男,2女")


Base.metadata.create_all()
# 映射到数据库

用session来创建和管理数据库连接的会话,这里的session和http中的session不同。
详情请看:关于session的详细介绍

添加数据

from sqlalchemy.orm  import sessionmaker

Session = sessionmaker()
session = Session()
add_info = Person(name='Jerry',gender=2)
session.add(add_info)

查询数据

from sqlalchemy.orm import sessionmaker

Session = sessionmaker()
session = Session()

result = session.query(Person).all() 
for i in result:
    print(i) 
#<Person(name:Jerry,gender:2)>
#<Person(name:Jeem,gender:1)>
#<Person(name:SeiLi,gender:2)>

当查询两条及两条以上数据时,元组方式显示

for i in session.query(Person.name,Person.gender):
    print(i)
    #('Jerry', 2)
    #('Jeem', 1)
    #('SeiLi', 2)

得到符合要求的第一条数据

# result = session.query(Person).filter_by(gender=2).all()[0]
result = session.query(Person).filter_by(gender=2).first()
print(result)

利用id 来查询数据

result = session.query(Person).get(3)
# 查询 id=3的数据
print(result)# <Person(name:Jeem,gender:1)>
# get查询不到id的数据,会返回None

删除数据

from sqlalchemy.orm import sessionmaker

Session = sessionmaker()
session = Session()

result = session.query(Person).filter_by(name='Jerry').first()
session.delete(result)
session.commit()

更改数据

from sqlalchemy.orm import sessionmaker

Session = sessionmaker()
session = Session()

result = session.query(Person).filter_by(name='Merry').first()
result.name = 'Jerry'
session.commit()

回滚数据 rollback()

from sqlalchemy.orm import sessionmaker

Session = sessionmaker()
session = Session()

session.rollback()

SQLAlchemy 属性常用数据类型

  • Integer:整形

  • Float:浮点型

  • DECIMAL:定点型price= Column(DECIMAL(20,2))
    两个参数,第一个设置总共多少位,第二个参数设置小数的位数

  • Boolean:布尔类型,True,False

  • String:字符型,指定长度

  • Text:文本类型

  • LONGTEXT:长文本类型

  • enum:枚举型gender = Column(Enum('男', '女'))

  • Date:日期型,传递datetime.date()

  • Time:时间型,传递 datetime.time()

  • DateTime:日期时间型,传递datetime.datetime()

create_time = Column(DateTime)
pp =  Person(name='LInsan',price=333.2321,gender='男',create_time=datetime(2020,4,21,18,41,33))

Column常用参数

  • default:默认值
  • nullable:是否允许为空
  • primary_key:主键
  • autoincrement:是否自增
  • ounique:是否唯一
  • onupdate:更新数据的时候执行
  • name :在数据库中的字段映射

query可用参数

  • func.count :求行的数量
  • func.max:求最大值
  • func.min:求最小值
  • func.avg:求平均值
  • func.sum:求和
result =  session.query(func.max(Person.price)).first()
print(result)

过滤器

  • ==:Person.name == "Jerry"

  • !=:Person.name != "Jerry"

  • in :Person.name.in_([ ' Jerry ',' Merry ' ] )

  • not in :~Person.name.in_([ ' Jerry ',' Merry ' ] )
    Person.name.notin_([ ' Jerry ',' Merry ' ] )

  • like :Person.name.like('%Jee%')
    模糊查询,%代表任意个字符

  • is null : Person.name.is_(None)

  • not null:Person.name.isnot(None)

  • 与 :and_(Person.name=='Jee',Person.name.gender==2)
    Person.name=='Jee',Person.name.gender==2

  • 或 : or_(条件1,条件2) 满足一个条件就可以执行

  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值