ORM介绍
背景:
用底层的sql写的话,相当于通过pymysql 游标的方式连接“http://blog.51cto.com/jacksoner/2113454 ”,为了避免把sql语句写死在代码里,有没有一种方法直接把原生sql封装好了并且以你熟悉的方式操作,像面向对象那样?
ORM就是对象映射关系程序。相当于ORM帮我们SQL写成类的形式,然后通过类来调用,获取,而不是写底层的sql(insert,update,select)来获取。
ORM 相当于把数据库也给你实例化了,在代码操作mysql中级又加了orm这一层。
orm的优点:
1、隐藏了数据访问细节,“封闭”的通用数据库交互,ORM的核心。他使得我们的通用数据库交互变得简单易行,并且完全不用考虑该死的SQL语句。快速开发,由此而来。
2、ORM使我们构造固化数据结构变得简单易行。
sqlalchemy安装
在Python中,最有名的ORM框架是SQLAlchemy。用户包括openstack\Dropbox等知名公司或应用
安装:
pip install SQLAlchemy
SQLAlchemy==1.2.7
pip install pymysql
数据库:
CentOS Linux release 7.4.1708
mysql版本:5.6.35
IP:192.168.1.48
用户:root
密码:123456
创建一个超级用户:grant all privileges on . to [email protected]‘%‘ identified by ‘123456‘ WITH GRANT OPTION;
创建一个数据库: mysql> create database sqlalchemy;
方式一:
import pymysql
import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String #创建列,整型,字符串型
engine = create_engine(‘mysql+pymysql://jacker:[email protected]/sqlalchemy‘,encoding=‘utf-8‘,echo=True)
#echo=True:显示创建sql信息
Base = declarative_base() # 生成orm基类
#这里的继承Base的类,创建user表,字段id(整型,主键) name(列 字符串32位) 密码(列 字符串64位)
class User(Base):
__tablename__ = ‘user‘ # 表名
id = Column(Integer, primary_key=True)
name = Column(String(32))
password = Column(String(64))
Base.metadata.create_all(engine) #创建表结构 (这里是父类调子类)
运行结果:
方式二 创建表,并写入数据:
创建表:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String
engine = create_engine(‘mysql+pymysql://jacker:[email protected]/sqlalchemy‘,encoding=‘utf-8‘)
metadata = MetaData(engine)
teacher = Table(‘user‘, metadata,
Column(‘id‘, Integer, primary_key=True),
Column(‘name‘, String(50), ),
Column(‘fullname‘, Integer),
Column(‘password‘, String(10)),
)
metadata.create_all(engine)
写入数据:
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
engine = create_engine(‘mysql+pymysql://jacker:[email protected]/sqlalchemy‘,encoding=‘utf-8‘)
#echo=True:显示信息
DBsession = sessionmaker(bind=engine)# 实例和engine绑定
session = DBsession() # 生成session实例,相当于游标
Base = declarative_base()# 生成orm基类
class User(Base):
__tablename__ = ‘user‘
id = Column(Integer, primary_key=True)
name = Column(String(100))
fullname = Column(String(100))
password = Column(String(100))
#实例化操作
user1 = User(id=1001, name=‘ling‘, password=123)
user2 = User(id=1002, name=‘molin‘, password="123abc")
user3 = User(id=1003, name=‘karl‘, password=16)
验证:
数据查询
my_user=session.query(User).filter_by(name=‘molin‘).first()#显示匹配name=molin的一条
my = session.query(User).filter_by().all() #显示所有
print(my) #这个是个列表,通过循环遍历
for i in my:
print(i.name)
print(i.password)
print(my_user.id,my_user.password,my_user.name) #调用
#session.commit() #查询就不用提交了
session.close()
‘‘‘
filter和filter_by 条件查询
filter_by(name="ling") 不能使用> < =
filter(Student.id>1001) 这个就必须使用Student.id 可以使用> < =等
‘‘‘
a = session.query(User).filter(User.id>1002).all()
for i in a:
print(i.name)
print(i.password)
session.close()
多条件查询
objs = Session.query(User).filter(User.id>0).filter(User.id<7).all()
上面2个filter的关系相当于 user.id >1 AND user.id <7 的效果
修改数据:
my_user = session.query(User).filter_by(name="molin").first()
my_user.name = "fenggf" # 查询出来之后直接赋值修改
my_user.passwork = "123qwe"
session.commit()
原文地址:http://blog.51cto.com/jacksoner/2115188