ORM
ORM(Object Rational Mapping),对象关系映射。用于把对象模型表示的对象映射到基于SQL的关系模型数据库结构中去。操作对象的属性就等于操作数据库中的记录。
ORM优点
a) 清楚直观,避免直接写SQL
b) 可以轻松写出复杂的查询(还好看
c) 可移植性强
py2和py3
由于py3已经不支持mysqldb这个模块了,可用PyMySql代替。
连接数据库的链接也由
'mysql+mysqlconnector://root:root@localhost:3306/test'变为
'mysql+pymysql://root:root@localhost:3306/test'
基本操作
a) 创建并连接引擎
#-*- coding:UTF-8 -*- from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
engine_url = 'mysql+mysqlconnector://root:root@localhost:3306/test' #数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名
engine_ = created_engine(engine_url, encoding='utf-8', echo=True) #echo 打印过程
Session_class = sessionmaker(engine_) #创建一个session工厂
Session = Session_class() #创建一个session类
b) 数据操作
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String Base = declarative_base() #sqlalchemy基础类 class User(Base): __tablename__ = 'user' id = Column(Integer, primary_key=True) name = Column(String(32)) password = Column(String(64)) def __repr__(self): res = ""{{id:{id},name:{name},pwd:{pwd}}}"".format(id=self.id, name=self.name, pwd= self.password) return res #create table Base.metadata.create_all(engine_) #insert user1 = User(name="LiMing", password="hahahah") user2 = User(name="HanMeiMei", password="ohuohuo") Session.add(user1) Session.add(user2) #select data = Session.query(User).filter(User.id<3).all() print(data)#返回的data是class,如果是多条数据则返回list,记录的值在相应的属性里;
#如果不选择查找属性(all/one/first)则data为解析的sql语句 #update data[0].name = "New" data[0].password = "New pwd" Session.commit() #delete Session.delete(data[1]) # *提交以上所有操作 Session.commit()
d) 提交操作
Session.commit()
relationship
relationship用于定义表与表的关系。
比如有用户表user、文章表article。文章是某个用户写的,一个用户可拥有多个文章。这是一对多关系。
class User(BASE): __tablename__ = 'users' id = Column(Integer, primary_key=True) username = Column(String(64), nullable=False, index=True) password = Column(String(64), nullable=False) email = Column(String(64), nullable=False, index=True) articles = relationship('Article', backref='author') # 文章和用户的关系链接
使用backref就不用在Article里面再反向relationship user了
relationship有一个很常用的参数lazy。默认值为'select',可选还有‘dynamic’(只能在一对多和多对多中使用)、joined(联结操作)。区别之后单说
批量插入
data = [] from random import randint,choice #method1 ORM for i in range(10): one = Student( class_id = randint(1,4), name = 'Student'+str(i+1), sex = choice([0,1]), age = randint(9,13) ) data.append(one) Session.add_all(data) Session.commit()
#method2 非ORM 快一些 for i in range(10,20): data.append( {'class_id':'randint(1,4)', 'name':'Student'+str(i+1), 'sex':choice([0,1]), 'age' : randint(9,13)} ) Session.execute(Student.__table__.insert(), data) Session.commit()