本篇对于Python操作MySQL主要使用两种方式:
pymsqlpymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同。 下载安装
使用操作 1、执行SQL
增,删,改需要执行 2、获取新创建数据自增ID
3、获取查询数据
注:在fetch数据时按照顺序进行,可以使用cursor.scroll(num,mode)来移动游标位置,如:
4、fetch数据类型 关于默认获取的数据是元祖类型,如果想要或者字典类型的数据,即:
补充: 1.SQL注入 由于字符串拼接出现注入
"select name from user where name='%s' and password ='%s' " %(username,password) pymysql 提供了转义功能:
"select name from user where name=%s and password =%s ",( username,password ) SQLAchemySQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作, 简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。 ORM: ORM框架的作用就是把数据库表的一行记录与一个对象互相做自动转换。 正确使用ORM的前提是了解关系数据库的原理。 ORM就是把数据库表的行与相应的对象建立关联,互相转换。 由于关系数据库的多个表还可以用外键实现一对多、多对多等关联, 相应地, ORM框架也可以提供两个对象之间的一对多、多对多等功能。 SQLAlchemy: 本身无法操作数据库,其必须以pymsql等第三方插件, Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如:
一、底层处理 使用 Engine/ConnectionPooling/Dialect 进行数据库操作,Engine使用ConnectionPooling连接数据库,然后再通过Dialect执行SQL语句。 ![]() 二、ORM功能使用 使用 ORM/Schema Type/SQL Expression Language/Engine/ConnectionPooling/Dialect 所有组件对数据进行操作。 根据类创建对象,对象转换成SQL,执行SQL。处理中文数据时,在连接数据库时要加上 ?charset=utf8 1.创建表 ![]() 一对多 ![]() 多对多 ![]() 2.操作表 ![]() .增 ![]() .删 ![]() .改 ![]() .查 ![]() 3.更多查询方法: ![]() 1.filter_by( ... ) 填写键值对方式 ret = session.query(Man).filter_by(name='alex').first() print(ret.nid,ret.name) 2.filter 填写条件判断 ret = session.query(Man).filter(Man.name=='eric').first() ret = session.query(Man).filter(Man.name=='eric' , Man.nid > 0).first() row = session.query(Man).filter(Man.nid.between(1,4)).all() ret = session.query(Users).filter(Users.id.in_(session.query(Users.id).filter_by(name='eric'))).all() 3.and_ or_ 条件判断 from sqlalchemy import and_, or_ ret = session.query(Man).filter(and_(Man.name == 'eric',Man.nid == 2)).first() ret = session.query(Man).filter(or_(Man.name == 'eric',Man.nid == 2)).first() 4.~ 取反 ret = session.query(Man).filter(Man.nid.in_([2,3])).first() ret = session.query(Man).filter(~Man.nid.in_([2,3])).first() 5.like + % 通配符 ret = session.query(Man).filter(Man.name.like('%x')).first() ret = session.query(Man).filter(~Man.name.like('%x')).first() 6.切片 限制 ( 序号,前闭后开 ) row = session.query(Man)[1:3] for ret in row: print(ret.nid, ret.name) row = session.query(Man).limit(3).offset(1) 7.order_by 排序 row = session.query(Man).order_by(Man.nid.desc()).all() row = session.query(Man).order_by(Man.nid.asc()).all() 8.group_by 分组 row = session.query(func.count('*')).select_from(Man).all() row = session.query(func.count('*')).filter(Man_To_Woman.nid > 1).all() row = session.query(func.count('*')).select_from(Man_To_Woman).group_by(Man_To_Woman.man_id).all() row = session.query(func.count('*')).select_from(Man_To_Woman).group_by(Man_To_Woman.man_id).limit(1).all() row = session.query(Man_To_Woman).group_by(Man_To_Woman.man_id).all() ret = session.query(Users).group_by(Users.extra).all() ret = session.query( func.max(Users.id), func.sum(Users.id), func.min(Users.id)).group_by(Users.name).all() ret = session.query( func.max(Users.id), func.sum(Users.id), func.min(Users.id)).group_by(Users.name).having(func.min(Users.id) >2).all() 9.join 连表 row = session.query(Users, Favor).filter(Users.id == Favor.nid).all() ret = session.query(Son).join(Father).all() ret = session.query(Son).join(Father, isouter=True).all() 10.union 组合 q1 = session.query(Users.name).filter(Users.id > 2) q2 = session.query(Favor.caption).filter(Favor.nid < 2) ret = q1.union(q2).all() q1 = session.query(Users.name).filter(Users.id > 2) q2 = session.query(Favor.caption).filter(Favor.nid < 2) ret = q1.union_all(q2).all() 更多功能参见文档,猛击这里下载PDF 补充 Relationship:
relationship : 通过relatioinship 找到绑定关系的数据 !!! 一对多,连表操作: ![]() 正向查询: 需求:查询Son表中所有数据,并且显示对应的Father表中的数据. ret = session.query(Son).all() for obj in ret: print(obj.nid,obj.name,obj.father_id,obj.father.name) 反向查询: 需求:查询Father表中, 属于 alvin 的所有儿子Son. obj = session.query(Father).filter(Father.name=='alvin').first() row = obj.son for ret in row: print(ret.nid,ret.name,ret.father.name) 多对多,连表操作: ![]() 正,反向操作: 1.alex的所有女人 2.凤姐的所有男人 man1 = session.query(Man).filter(Man.name=='alex').first() print(man1) for ret in man1.woman: print(ret.nid,ret.name) woman1 = session.query(Woman).filter(Woman.name=='fengjie').first() print(woman1) for ret in woman1.man: print(ret.nid,ret.name) relatioinship 语句的简写: ,我添加到Man表中 woman = relationship("Woman", secondary=Man_To_Woman.__table__,backref='man')
1 关于 session.add session.query session.commit的顺序问题? 就是说在同一个会话中, insert into table (xxxx)后,可以select * from xxx;可以查询到插入的数据,只是不能在其他会话,比如我另开一个客户端去连接数据库不能查询到刚刚插入的数据。 这个数据已经到数据库。值是数据库吧这个数据给锁了。只有插入数据的那个session可以查看到,其他的session不能查看到,可以理解提交并解锁吧。 |
|