ORM 框架 SQLALchemy

夙愿已清 提交于 2020-01-31 08:35:10

目录

安装

连接

创建数据表

删除数据表

操作 sql 创建会话

添加数据

更新数据

查询数据


安装

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)

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!