目录
安装
pip install sqlalchemy
pip install pymysql
连接
# 连接数据库
from sqlalchemy import create_engine
engine = create_engine(
"mysql+pymysql://root:1990@localhost:3306/test?charset=utf8",
echo=True,pool_size=5,max_overflow=4,pool_recycle=7200,
pool_timeout=30)
mysql+pymysql://root:1990@localhost:3306/test?charset=utf8:mysql 指明数据库系统类型,pymysql是连接数据库接口模块,root 是数据库系统用户名,110 是数据库系统密码,localhost:3306 是本地的数据库系统和数据库端口,test 是数据库名称
echo=Ture:用于显示 SQLALchemy 在操作数据库时所执行的 sql 语句情况,相当于一个监视器,可以清楚知道执行情况,如果设置为 False,就可以关闭
pool_size:设置连接数,默认5个,
max_overflow:默认10,当超出最大连接数后,如果超出数值在此范围以内,还可以继续连接访问,在使用过后,这部分连接不放在pool中,而是真正关闭
pool_recycle:连接重置周期,默认为-1,推荐设置为7200,即如果连接已空闲7200秒,就自动重新获取,以防止 connection 被关闭
pool_timeout:超时时间,默认30秒
创建数据表
from sqlalchemy import Column, Integer, String, DateTime
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class mytable(Base):
# 表名
__tablename__ = 'mytable'
# 字段,属性
id = Column(Integer, primary_key=True)
name = Column(String(50), unique=True)
age = Column(Integer)
birth = Column(DateTime)
class_name = Column(String(50))
Base.metadata.create_all(engine)
# 创建数据表方法二
from sqlalchemy import Column, MetaData, ForeignKey, Table
from sqlalchemy.dialects.mysql import (INTEGER, CHAR)
meta = MetaData()
myclass = Table('myclass', meta,
Column('id', INTEGER, primary_key=True),
Column('name', CHAR(50), ForeignKey(mytable.name)),
Column('class_name', CHAR(50))
)
myclass.create(bind=engine)
删除数据表
# 删除数据表
myclass.drop(bind=engine)
Base.metadata.drop_all(engine)
删除时要先删除设有外键的数据表
操作 sql 创建会话
from sqlalchemy.orm import sessionmaker
DBSession = sessionmaker(bind=engine)
session = DBSession()
添加数据
new_data = mytable(name='Li Lei',age=10,birth='2017-10-01',class_name='一年级一班')
session.add(new_data)
session.commit()
session.close()
更新数据
session.query(mytable).filter_by(id=1).update({ mytable.age : 12})
session.commit()
session.close()
首先查询 mytable 表 id 为 1 的数据,然后 updata 更新,数据格式是字典类型,如果批量更新,就可以将 filter_by(id=1) 去掉,这样就是把所有 age 字段的值更新
使用赋值方式更新,适用于更新一条
get_data = session.query(mytable).filter_by(id=1).first()
get_data.class_name = '三年级三班'
session.commit()
session.close()
查询数据
查询全部
# 查询mytable全部数据
get_data = session.query(mytable).all()
for i in get_data:
print('我的名字是:' + i.name)
print('我的班级是:' + i.class_name)
session.close()
session.query(mytable) 相当于 select * from mytable
all() 以列表返回
查询某一字段
get_data = session.query(mytable.name, mytable.class_name).all()
for i in get_data:
print('我的名字是:' + i.name)
print('我的班级是:' + i.class_name)
设置筛选条件
# 筛选方法一:
get_data = session.query(myclass).filter(myclass.id==1).all()
# 筛选方法二:
get_data = session.query(myclass).filter_by(id=1).all()
print('数据类型是:' + str(type(get_data)))
for i in get_data:
print('我的名字是:' + i.name)
print('我的班级是:' + i.class_name)
区别在于 filter filter_by
1-字段写法:filter 筛选的字段是带类名(表名)的,filter_by 只需筛选字段即可
2-作用范围:filter 可以用于单表或者多表查询,而 filter_by 只能用于单表查询
all() 将所有数据以列表返回
如果只想要第一条数据 first()
多条件筛选
and
get_data = session.query(mytable).filter(mytable.id >= 2,
mytable.class_name == '三年级二班').first()
print('数据类型是:' + str(type(get_data)))
print('我的名字是:' + get_data.name)
print('我的班级是:' + get_data.class_name)
or
get_data = session.query(mytable).filter(or_(mytable.id >= 2,
mytable.class_name == '三年级二班')).first()
print('数据类型是:' + str(type(get_data)))
print('我的名字是:' + get_data.name)
print('我的班级是:' + get_data.class_name)
内连接,外连接
# 内连接
get_data = session.query(mytable).join(myclass).filter(mytable.class_name == '三年级二班').all()
print('数据类型是:' + str(type(get_data)))
for i in get_data:
print('我的名字是:' + i.name)
print('我的班级是:' + i.class_name)
# 外连接
get_data = session.query(mytable).outerjoin(
myclass).filter(mytable.class_name == '三年级二班').all()
执行 sql 语句,
比较复杂时用
sql = 'select * from mytable '
session.execute(sql)
来源:CSDN
作者:木下瞳
链接:https://blog.csdn.net/zjkpy_5/article/details/104115877