ORM、SQLAlchemy数据库操作

文章目录

[隐藏]

  • ORM介绍
  • sqlalchemy安装
  • 数据查询
  • 修改数据
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 jacker@’%’ 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(ling', password=123)  user2 = User(molin', password="123abc")  user3 = User(karl', password=16)    #需要添加到session中,然后再提交,表里才可以有数据  session.add(user1)  session.add(user2)  session.add(user3)  session.commit()  

验证:

数据查询
my_user=session.query(User).filter_by(name='molin').first()#显示匹配name=molin的第一条数据,因为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()  
如果出现name相同的,想都打印出来的话:  #实例化操作  user1 = User(test1', password=123)  user2 = User(test2', password="123abc")  user4 = User(test2', password="123abc")  user3 = User(test3', password=16)    my_user = session.query(User).filter_by(name="test2").all()       #my_user:这个是列表  for i in my_user:      print(i.id)      print(i.name)      print(i.password)  
多条件查询    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()  

原文出处:51cto -> http://blog.51cto.com/jacksoner/2115188

本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如果侵犯你的利益,请发送邮箱到 [email protected],我们会很快的为您处理。