目录
- SQLAlchemy
- cmd安装
- 连接mysql
- SQLAlchemy ORM
- 创建表
- 添加数据
- 查询数据
- 删除数据
- 更改数据
- 回滚数据 rollback()
- SQLAlchemy 属性常用数据类型
- Column常用参数
- query可用参数
- 过滤器
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)
满足一个条件就可以执行