SQLAlchemy
SQLAlchemy安装
- 安装
- pip install sqlalchemy -i https://pypi.douban.com/simple
- 连接的时候依赖pymysql
通过SQLAlchemy连接数据库
- from sqlalchemy import create_engine
- # 数据库的配置变量
- HOSTNAME = '127.0.0.1'
- PORT = '3306'
- DATABASE = 'xt_flask'
- USERNAME = 'root'
- PASSWORD = 'root'
- DB_URI = 'mysql+mysqldb://{}:{}@{}:{}/{}'.format(USERNAME,PASSWORD,HOSTNAME,PORT,DATABASE)
- # 创建数据库引擎
- engine = create_engine(DB_URI)
- #创建连接
- with engine.connect() as con:
- rs = con.execute('SELECT 1')
- print rs.fetchone()
- 首先从sqlalchemy中导入create_engine,用这个函数来创建引擎,然后用engine.connect()来连接数据库。其中一个比较重要的一点是,通过create_engine函数的时候,需要传递一个满足某种格式的字符串,对这个字符串的格式来进行解释:
- dialect+driver://username:password@host:port/database
- dialect是数据库的实现,比如MySQL、PostgreSQL、SQLite,并且转换成小写。driver是Python对应的驱动,如果不指定,会选择默认的驱动,比如MySQL的默认驱动是MySQLdb。username是连接数据库的用户名,password是连接数据库的密码,host是连接数据库的域名,port是数据库监听的端口号,database是连接哪个数据库的名字。
- 如果以上输出了1,说明SQLAlchemy能成功连接到数据库。
SQLAlchemy参数
- Column常用参数:
- default:默认值。
- nullable:是否可空。
- primary_key:是否为主键。
- unique:是否唯一。
- autoincrement:是否自动增长。
- onupdate:更新的时候执行的函数。
- name:该属性在数据库中的字段映射。
- sqlalchemy常用数据类型:
- Integer:整形。
- Float:浮点类型。
- Boolean:传递True/False进去。
- DECIMAL:定点类型。
- enum:枚举类型。
- Date:传递datetime.date()进去。
- DateTime:传递datetime.datetime()进去。
- Time:传递datetime.time()进去。
- String:字符类型,使用时需要指定长度,区别于Text类型。
- Text:文本类型。
- LONGTEXT:长文本类型。
- query可用参数:
- 模型对象。指定查找这个模型中所有的对象。
- 模型中的属性。可以指定只查找某个模型的其中几个属性。
- 聚合函数。
- func.count:统计行的数量。
- func.avg:求平均值。
- func.max:求最大值。
- func.min:求最小值。
- func.sum:求和。
创建表
- # -*- coding: utf-8 -*-
- from sqlalchemy.ext.declarative import declarative_base
- from sqlalchemy import Column # 列
- from sqlalchemy import Integer, String # 属性
- Base = declarative_base() # django models
- # 创建表
- class User(Base):
- __tablename__ = 'user'
- id = Column(Integer, primary_key=True, autoincrement=True)
- name = Column(String(32), index=True, name='名字')
- # 数据库连接
- from sqlalchemy import create_engine
- engine = create_engine("mysql+pymysql://root:redhat@192.168.32.71:3306/my_sql?charset=utf8")
- # 去engine数据库中创建所有继承Base的表
- Base.metadata.create_all(engine)
增加数据
- # -*- coding: utf-8 -*-
- from .create import engine, User
- # 增加数据
- # 创建会话窗口
- from sqlalchemy.orm import sessionmaker
- Session = sessionmaker(engine)
- # 打开会话窗口
- db_session = Session()
- # ---单条数据
- user_obj = User(name='Ywb') # 实例化
- db_session.add(user_obj) # 相当于 insert into
- # 执行会化窗口中的所有操作
- db_session.commit()
- db_session.close()
- # ---增加批量数据
- db_session.add_all([
- User(name='peach'),
- User(name='小红')
- ])
- db_session.commit()
- db_session.close()
- # ---扩展
- user1 = User(name='11')
- user2 = User(name='12')
- user3 = User(name='13')
- user4 = User(name='14')
- db_session.add(user1)
- db_session.add(user2)
- db_session.add(user3)
- db_session.add(user4)
- db_session.commit() # 全部添加进去
- db_session.close()
过滤
- 过滤是数据提取的一个很重要的功能,以下对一些常用的过滤条件进行解释,并且这些过滤条件都是只能通过filter方法实现的:
- equals:
- query.filter(User.name == 'ed')
- not equals:
- query.filter(User.name != 'ed')
- like:
- query.filter(User.name.like('%ed%'))
- in:
- query.filter(User.name.in_(['ed','wendy','jack']))
- # 同时,in也可以作用于一个Query
- query.filter(User.name.in_(session.query(User.name).filter(User.name.like('%ed%'))))
- not in:
- query.filter(~User.name.in_(['ed','wendy','jack']))
- is null:
- query.filter(User.name==None)
- # 或者是
- query.filter(User.name.is_(None))
- is not null:
- query.filter(User.name != None)
- # 或者是
- query.filter(User.name.isnot(None))
- and:
- from sqlalchemy import and_
- query.filter(and_(User.name=='ed',User.fullname=='Ed Jones'))
- # 或者是传递多个参数
- query.filter(User.name=='ed',User.fullname=='Ed Jones')
- # 或者是通过多次filter操作
- query.filter(User.name=='ed').filter(User.fullname=='Ed Jones')
- or:
- from sqlalchemy import or_
- query.filter(or_(User.name=='ed',User.name=='wendy'))
单表查询
- # -*- coding: utf-8 -*-
- # 单表查询
- from sqlalchemy.orm import sessionmaker
- from SQLAlchemy.create import engine, User
- Session = sessionmaker(engine)
- db_session = Session()
- # ---基本查询
- # select * from name
- user_list = db_session.query(User)
- print(user_list) # SELECT user.`名字` AS `user_名字`, user.id AS user_id FROM user
- # ---------------- 所有数据 ------------------
- user_list = db_session.query(User).all() # [obj, obj]
- for usr in user_list:
- print(usr.name)
- # ---------------- 一条数据 ------------------
- user = db_session.query(User).first() # obj
- print(user.name)
- # ---------------- 带条件查询 ------------------
- # --- filter
- user_list = db_session.query(User).filter(User.id==2).all() # [obj, obj]
- print(user_list)
- user_list = db_session.query(User).filter(User.id >= 1).all() # [obj, obj]
- for user in user_list:
- print(user.id) # 按照id排序,因为添加是id
- # --- filter_by
- user = db_session.query(User).filter_by(id=2).first() # obj
- print(user)
- # --- 扩展-查看sql语句
- sql = db_session.query(User).filter(User.id >= 1)
- print(sql)
- """
- SELECT user.`名字` AS `user_名字`, user.id AS user_id
- FROM user
- WHERE user.id >= %(id_1)s
- """
修改
- # -*- coding: utf-8 -*-
- # 更新修改数据
- from sqlalchemy.orm import sessionmaker
- from SQLAlchemy.create import engine,User
- Session = sessionmaker(engine)
- db_session = Session()
- # 单条修改
- # update `uesr` set `name` = 'haha' where id =1
- res = db_session.query(User).filter(User.id==1).update({
- "name": 'haha'
- })
- print(res) # 返回影响的行数
- db_session.commit()
- db_session.close()
- # 批量修改
- res = db_session.query(User).filter(User.id > 1).update({
- "name": "1234"
- })
- print(res)
- db_session.commit()
- db_session.close()
删除
- # -*- coding: utf-8 -*-
- # 删除数据
- from sqlalchemy.orm import sessionmaker
- from SQLAlchemy.create import engine,User
- Session = sessionmaker(engine)
- db_session = Session()
- # 删除单条
- # delete from user where id = 1
- res = db_session.query(User).filter(User.id==1).delete()
- print(res) # 返回影响的行数
- db_session.commit()
- db_session.close()
- # 删除多条
- res = db_session.query(User).filter(User.name=="12345").delete()
- print(res)
- db_session.commit()
- db_session.close()