mysql篇---ORM框架
Posted nayike
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql篇---ORM框架相关的知识,希望对你有一定的参考价值。
一.对于Python操作mysql主要使用两种方式:
- 原生模块 pymsql
- ORM框架 SQLAchemy
a.pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同。
Pymysql(py2,py3)/MySQLDB(py2)
1.下载安装
pip3 install pymysql
b.使用操作
1.执行SQL
#!/usr/bin/env python # -*- coding:utf-8 -*- import pymysql # 创建连接 conn = pymysql.connect(host=\'127.0.0.1\', port=3306, user=\'root\', passwd=\'123\', db=\'t1\') # 创建游标 cursor = conn.cursor() # 执行SQL,并返回收影响行数 effect_row = cursor.execute("update hosts set host = \'1.1.1.2\'") # 执行SQL,并返回受影响行数 #effect_row = cursor.execute("update hosts set host = \'1.1.1.2\' where nid > %s", (1,)) # 执行SQL,并返回受影响行数 #effect_row = cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)]) # 提交,不然无法保存新建或者修改的数据 conn.commit() # 关闭游标 cursor.close() # 关闭连接 conn.close()
2.获取新创建数据自增ID
import pymysql conn = pymysql.connect(host=\'127.0.0.1\', port=3306, user=\'root\', passwd=\'123\', db=\'t1\') cursor = conn.cursor() cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)]) conn.commit() cursor.close() conn.close() # 获取最新自增ID new_id = cursor.lastrowid
3.获取查询数据
import pymysql conn = pymysql.connect(host=\'127.0.0.1\', port=3306, user=\'root\', passwd=\'123\', db=\'t1\') cursor = conn.cursor() cursor.execute("select * from hosts") # 获取第一行数据 row_1 = cursor.fetchone() # 获取前n行数据 # row_2 = cursor.fetchmany(3) # 获取所有数据 # row_3 = cursor.fetchall() conn.commit() cursor.close() conn.close()
注:在fetch数据时按照顺序进行,可以使用cursor.scroll(num,mode)来移动游标位置,如:
- cursor.scroll(1,mode=\'relative\') # 相对当前位置移动
- cursor.scroll(2,mode=\'absolute\') # 相对绝对位置移动
4、fetch数据类型
关于默认获取的数据是元祖类型,如果想要或者字典类型的数据,即:
import pymysql conn = pymysql.connect(host=\'127.0.0.1\', port=3306, user=\'root\', passwd=\'123\', db=\'t1\') # 游标设置为字典类型 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) r = cursor.execute("call p1()") result = cursor.fetchone() conn.commit() cursor.close() conn.close()
二.ORM框架
#ORM框架有两类: 1.DB first: 手动创建数据库以及表 -> ORM框架 -> 自动生成类 2.code first: 手动创建类、和数据库 -> ORM框架 -> 以及表 (SQLAlchemy属于此) 功能: - 创建数据库表 - 连接数据库(非SQLAlchemy, 可以:pymyql,mysqldb,....) - 类转换SQL语句 (SQLAlchemy:负责转换) 作用: 1. 提供简单的规则 2. 自动转换成SQL语句 ORM 原理:通过类和对象,转化为Sql语句,再借用第三方(如:Pymysql)去连接,去发送
三. SQLAlchemy
SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。
安装:
pip3 install SQLAlchemy
SQLAlchemy本身无法操作数据库,其必须以来pymsql等第三方插件,Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如:
MySQL-Python mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname> pymysql mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>] MySQL-Connector mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname> cx_Oracle oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...] 更多详见:http://docs.sqlalchemy.org/en/latest/dialects/index.html
四.功能使用
#创建表的参照
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index from sqlalchemy.orm import sessionmaker, relationship from sqlalchemy import create_engine engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/t1", max_overflow=5) Base = declarative_base() # 创建单表 class Users(Base): __tablename__ = \'users\' id = Column(Integer, primary_key=True) name = Column(String(32)) extra = Column(String(16)) __table_args__ = ( UniqueConstraint(\'id\', \'name\', name=\'uix_id_name\'), Index(\'ix_id_name\', \'name\', \'extra\'), ) # 一对多 class Favor(Base): __tablename__ = \'favor\' nid = Column(Integer, primary_key=True) caption = Column(String(50), default=\'red\', unique=True) class Person(Base): __tablename__ = \'person\' nid = Column(Integer, primary_key=True) name = Column(String(32), index=True, nullable=True) favor_id = Column(Integer, ForeignKey("favor.nid")) # 多对多 class Group(Base): __tablename__ = \'group\' id = Column(Integer, primary_key=True) name = Column(String(64), unique=True, nullable=False) port = Column(Integer, default=22) class Server(Base): __tablename__ = \'server\' id = Column(Integer, primary_key=True, autoincrement=True) hostname = Column(String(64), unique=True, nullable=False) class ServerToGroup(Base): __tablename__ = \'servertogroup\' nid = Column(Integer, primary_key=True, autoincrement=True) server_id = Column(Integer, ForeignKey(\'server.id\')) group_id = Column(Integer, ForeignKey(\'group.id\')) def init_db(): Base.metadata.create_all(engine) def drop_db(): Base.metadata.drop_all(engine)
注:设置外检的另一种方式 ForeignKeyConstraint([\'other_id\'], [\'othertable.other_id\'])
1.操作表
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column,Integer,String, VARCHAR,ForeignKey, UniqueConstraint,Index from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker,relationship Base = declarative_base() class UserType(Base): __tablename__ = \'usertype\' id = Column(Integer, primary_key=True, autoincrement=True) title = Column(VARCHAR(32), nullable=True, index=True) class Users(Base): __tablename__ = \'users\' id = Column(Integer, primary_key=True,autoincrement=True) name = Column(VARCHAR(32),nullable=True,index=True) email = Column(String(16)) user_type_id = Column(Integer,ForeignKey(\'usertype.id\')) user_type = relationship(\'UserType\',backref=\'xx\') def create_db(): engine = create_engine("mysql+pymysql://root:@127.0.0.1:3306/alchemy?charset=utf8", max_overflow=5) Base.metadata.create_all(engine) def drop_db(): engine = create_engine("mysql+pymysql://root:@127.0.0.1:3306/alchemy?charset=utf8", max_overflow=5) Base.metadata.drop_all(engine) engine = create_engine("mysql+pymysql://root:@127.0.0.1:3306/alchemy?charset=utf8", max_overflow=5) Session = sessionmaker(bind=engine) session = Session() #这里的session是 会话,连接的意思 #---创建表 # create_db() # drop_db() session.commit() #不要忘了 commit session.close()
##---增加--- obj = UserType(title=\'普通用户\') session.add(obj) objs =[ UserType(title=\'超级用户\'), UserType(title=\'白金用户\'), UserType(title=\'黑金用户\'), ] session.add_all(objs) ##------- 查 print(session.query(UserType)) user_type_list = session.query(UserType).all() for row in user_type_list: print(row.id,row.title) user_type_list = session.query(UserType.id,UserType.title).filter(UserType.id > 2) for row in user_type_list: print(row.id,row.title) ##----------删 session.query(UserType).filter(UserType.id > 0).delete() ##----------修改 session.query(UserType.id,UserType.title).filter(UserType.id > 1).update({"title" : "黑金"}) session.query(UserType.id,UserType.title).filter(UserType.id > 0).update({UserType.title: UserType.title + "x"}, synchronize_session=False) session.query(UserType.id,UserType.title).filter(UserType.id > 0).update({"num": Users.num + 100}, synchronize_session="evaluate") #没有添加此字段
# 分组,排序,连表,通配符,子查询,limit,union,where,原生SQL、 # ret = session.query(Users, UserType) # select * from user,usertype; # # ret = session.query(Users, UserType).filter(Users.usertype_id==UserType.id) # select * from user,usertype whre user.usertype_id = usertype.id # result = session.query(Users).join(UserType) # print(result) # result = session.query(Users).join(UserType,isouter=True) # print(result) # # 1. # select * from b where id in (select id from tb2) # 2 select * from (select * from tb) as B # q1 = session.query(UserType).filter(UserType.id > 0).subquery() # result = session.query(q1).all() # print(result) # 3 # select # id , # (select * from users where users.user_type_id=usertype.id) # from usertype; # session.query(UserType,session.query(Users).filter(Users.id == 1).subquery()) # session.query(UserType,Users) # result = session.query(UserType.id,session.query(Users).as_scalar()) # print(result) # result = session.query(UserType.id,session.query(Users).filter(Users.user_type_id==UserType.id).as_scalar()) # print(result) # 问题1. 获取用户信息以及与其关联的用户类型名称(FK,Relationship=>正向操作) # user_list = session.query(Users,UserType).join(UserType,isouter=True) # print(user_list) # for row in user_list: # print(row[0].id,row[0].name,row[0].email,row[0].user_type_id,row[1].title) # user_list = session.query(Users.name,UserType.title).join(UserType,isouter=True).all() # for row in user_list: # print(row[0],row[1],row.name,row.title) # user_list = session.query(Users) # for row in user_list: # print(row.name,row.id,row.user_type.title) # 问题2. 获取用户类型 # type_list = session.query(UserType) # for row in type_list: # print(row.id,row.title,session.query(Users).filter(Users.user_type_id == row.id).all()) # type_list = session.query(UserType) # for row in type_list: # print(row.id,row.title,row.xxoo)
# 条件 ret = session.query(Users).filter_by(name=\'tom\').all() ret = session.query(Users).filter(Users.id > 1, Users.name == \'tom\').all() ret = session.query(Users).filter(Users.id.between(1, 3), Users.name == \'tom\').all() ret = session.query(Users).filter(Users.id.in_([1,3,4])).all() ret = session.query(Users).filter(~Users.id.in_([1,3,4])).all() ret = session.query(Users).filter(Users.id.in_(session.query(Users.id).filter_by(name=\'tom\'))).all() from sqlalchemy import and_, or_ ret = session.query(Users).filter(and_(Users.id > 3, Users.name == \'tom\')).all() ret = session.query(Users).filter(or_(Users.id < 2, Users.name == \'tom\')).all() ret = session.query(Users).filter( or_( Users.id < 2, and_(Users.name == \'tom\', Users.id > 3), Users.extra != "" )).all() # 通配符 ret = session.query(Users).filter(Users.name.like(\'t%\')).all() ret = session.query(Users).filter(~Users.name.like(\'t%\')).all() # 限制 ret = session.query(Users)[1:2] # 排序 ret = session.query(Users).order_by(Users.name.desc()).all() ret = session.query(Users).order_by(Users.name.desc(), Users.id.asc()).all() # 分组 from sqlalchemy.sql import func 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() # 连表 ret = session.query(Users, Favor).filter(Users.id == Favor.nid).all() ret = session.query(Person).join(Favor).all() ret = session.query(Person).join(Favor, isouter=True).all() # 组合 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()
## relationship
有 relationship
以上是关于mysql篇---ORM框架的主要内容,如果未能解决你的问题,请参考以下文章