• 一个初学者的辛酸路程-python操作SQLAlchemy-13


    前言

      其实一开始写blog,我是拒绝的,但是,没办法,没有任何理由抗拒。今天呢,要说的就是如何使用Python来操作数据库。

    SQLAlchemy

    SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API智商,使用关系对象映射进行数据库操作,换句话说就是:将对象转换成SQL,然后使用数据API执行SQL语句并获取到执行结果。

    以前我们常用pymysql来操作数据库,举个栗子

    (需要提前安装上pymysql)

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # Author: Leon xie
    
    import  pymysql
    
    #创建连接
    conn = pymysql.connect(host='192.168.56.11',port=3306,user='root',passwd='root',db='oldboydb')
    #创建游标  socket上建立的实例
    cursor=conn.cursor()
    
    #执行SQL,并返回行数,用游标执行,
    effect_row = cursor.execute("select * from student")
    # print(cursor.fetchone())
    # print(cursor.fetchone())
    print(cursor.fetchall())
    

    这样就可以把数据全部取出来。

    插入数据呢?

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # Author: Leon xie
    
    import  pymysql
    
    #创建连接
    conn = pymysql.connect(host='192.168.56.11',port=3306,user='root',passwd='root',db='oldboydb')
    #创建游标  socket上建立的实例
    cursor=conn.cursor()
    
    #执行SQL,并返回行数,用游标执行,
    #effect_row = cursor.execute("select * from student")
    # print(cursor.fetchone())
    # print(cursor.fetchone())
    # print(cursor.fetchall())
    
    data = [
        ("N1","2015-05-22",'M'),
        ("N2","2015-05-22",'M'),
        ("N3","2015-05-22",'M'),
        ("N4","2015-05-22",'M'),
    ]
    
    cursor.executemany("insert into student (name,register_date,gender) values(%s,%s,%s)",data )
    
    conn.commit()
    有个问题,上面需要我写原生的SQL语句来使用。如果写原生,自己增删改,如果简单还行,复杂就很麻烦了,重用性不强,因为都是写死在里面,如果数据库结果变化就的改,对扩展什么都不方便,包括
    SQL水平也就一般般,很多情况写不出高效的SQL语句,涉及到软件好慢好慢,加机器都不好使。
    为了避免,我们把原生SQL写死到源代码里,怎么办呢?就要引入下面的东西。
    SQLAlchemy是python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作。简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。
    这样,就不用写原生的SQL了。

    所以我们引入了ORM,什么是ORM?

    ORM就是对象映射关系程序。相当于ORM帮我们把对象里的转化成SQL然后跟数据库交互

    ORM的优点:

    1、隐藏了数据访问细节,封闭的通用数据库交互,ORM的核心,它使得我们的通用数据库交互变得简单易行,并且完全不用考虑该死的SQL语句。快速开发,由此而来。

    2、ORM使我们构造固化数据结构变得简单易行。

    缺点:

    1、无可避免,自动化意味着映射和关联管理,代价是牺牲性能

    ORM是一个术语,不是一个软件,基于ORM的标准下,有很多软件,最执行的就是SQLAlchemy ,(SQL 阿哥迷)

    如何使用?

    windows下安装

    pip install sqlalchemy

    接下来利用ORM实现一个创建表的功能

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # Author: Leon xie
    
    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://root:root@192.168.56.11/oldboydb",encoding='utf-8',echo=True)
    #echo=True,就是把整个过程打印出来
    Base=declarative_base() #生成ORM基类
    
    class User(Base):
        __tablename__ = 'user' #表名
        id = Column(Integer,primary_key=True) #字段,整形,主键 column是导入的
        name = Column(String(32))
        password = Column(String(64))
    
    Base.metadata.create_all(engine) #创建表结构

    实现结果,就是在数据库创建了一个表,user,再次执行,如果数据库有,它就不会创建了。

    插入数据

    '''
    创建数据,有个游标的东西叫做sessionmaker需要单独导入
    '''
    
    #实例与socket绑定,创建与数据库的绘画session class,注意,这里返回
    #给session的是一个class,不是实例
    Session_class = sessionmaker(bind=engine)
    #生成session实例,cursor
    Session = Session_class()
    
    #生产你要创建的数据对象
    xiedi_obj = User(name="alex",password="123")
    xiedi_obj2 = User(name="jack",password="123")
    #目前还没有创建对象,可以打印看看,上面只是申明
    print(xiedi_obj.name,xiedi_obj.id)
    
    #把要创建的数据对象添加到这个session里,一会同一创建
    Session.add(xiedi_obj)
    Session.add(xiedi_obj2)
    #这里依旧没有创建
    print(xiedi_obj.name,xiedi_obj.id)
    
    #现在才同一提交,创建数据
    Session.commit()

    查询

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # Author: Leon xie
    
    '''
    利用ORM实现一个创建表的功能
    '''
    import sqlalchemy
    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column,Integer,String
    from sqlalchemy.orm import sessionmaker
    #创建连接
    engine = create_engine("mysql+pymysql://root:root@192.168.56.11/oldboydb",encoding='utf-8')
    Base = declarative_base()  #生成ORM基类
    #创建表结构
    class User(Base):
        __tablename__ = 'xiedi' #表名
        id = Column(Integer,primary_key=True)
        name = Column(String(32))
        password = Column(String(64))
    
        def __repr__(self):
            return "<%s name:%s>" % (self.id,self.name)
    
    #直接调用基类下的方法,创建表结构
    Base.metadata.create_all(engine)
    '''
    查看
    '''
    T1 = sessionmaker(bind=engine)
    T2 = T1()
    #filter查出来的是一组数据,它不知道你要查多少
    data = T2.query(User).filter_by().all()
    print(data)
    打印结果
    [<1 name:alex>, <2 name:jack>]

    修改,原理就是搜索出来,然后赋值

    data = Session.query(User).filter(User.id>1).filter(User.id<4).first()
    print(data)
    data.name = "Jack Liu"
    data.password = "Shit happens"
    #提交
    Session.commit()

    统计

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # Author: Leon xie
    
    '''
    利用ORM实现一个创建表的功能
    '''
    
    import sqlalchemy
    
    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column,Integer,String
    from sqlalchemy.orm import sessionmaker
    #创建连接
    engine = create_engine("mysql+pymysql://root:root@192.168.56.11/oldboydb",encoding='utf-8')
    Base = declarative_base()  #生成ORM基类
    
    #创建表结构
    class User(Base):
        __tablename__ = 'xiedi' #表名
        id = Column(Integer,primary_key=True)
        name = Column(String(32))
        password = Column(String(64))
    
    #直接调用基类下的方法
    Base.metadata.create_all(engine)
    
    #实例与socket绑定,创建与数据库的绘画session class,注意,这里返回
    #给session的是一个class,不是实例
    Session_class = sessionmaker(bind=engine)
    #生成session实例,cursor
    Session = Session_class()
    
    #创建用户
    fake_user = User(name='rain',password="12345")
    Session.add(fake_user)
    
    print(Session.query(User).filter(User.name.in_(['xiedi','rain','jack'])).all())
    
    Session.rollback()
    print(Session.query(User).filter(User.name.in_(['xiedi','rain','jack'])).all())
    
    print(Session.query(User).filter(User.name.in_(['Jack','rain'])).count())
    打印结果
    1

    那么如何取分组呢?统计每个名字出现多少次

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # Author: Leon xie
    
    '''
    利用ORM实现一个创建表的功能
    '''
    import sqlalchemy
    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column,Integer,String
    from sqlalchemy.orm import sessionmaker
    #创建连接
    engine = create_engine("mysql+pymysql://root:root@192.168.56.11/oldboydb",encoding='utf-8')
    Base = declarative_base()  #生成ORM基类
    #创建表结构
    class User(Base):
        __tablename__ = 'xiedi' #表名
        id = Column(Integer,primary_key=True)
        name = Column(String(32))
        password = Column(String(64))
    #直接调用基类下的方法,创建表结构
    Base.metadata.create_all(engine)
    
    '''
    创建数据,有个游标的东西叫做sessionmaker需要单独导入
    '''
    
    #实例与socket绑定,创建与数据库的绘画session class,注意,这里返回
    #给session的是一个class,不是实例
    Session_class = sessionmaker(bind=engine)
    #生成session实例,cursor
    Session = Session_class()
    
    from sqlalchemy import func
    
    print(Session.query(User.name,func.count(User.name)).group_by(User.name).all())
    打印结果
    [('alex', 1, 'alex'), ('Jack Liu', 1, 'Jack Liu')]

    外键关联

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # Author: Leon xie
    
    import sqlalchemy
    
    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column,Integer,String,DATE,Enum
    from sqlalchemy.orm import sessionmaker
    
    engine = create_engine("mysql+pymysql://root:root@192.168.56.11/oldboydb",encoding='utf-8')
    #echo=True,就是把整个过程打印出来
    Base=declarative_base() #生成ORM基类
    class User(Base):
        __tablename__ = 'user' #表名
        id = Column(Integer,primary_key=True) #字段,整形,主键 column是导入的
        name = Column(String(32))
        password = Column(String(64))
    
        def __repr__(self):
            return "<%s name:%s>" % (self.id,self.name)
    
    class Student(Base):
        __tablename__ = 'student' #表名
        id = Column(Integer,primary_key=True) #字段,整形,主键 column是导入的
        name = Column(String(32),nullable=False)
        register_date = Column(DATE,nullable=False)
        gender = Column(String(32),nullable=False)
    
        def __repr__(self):
            return "<%s name:%s>" % (self.id,self.name)
    
    Base.metadata.create_all(engine) #创建表结构
    
    Session_class = sessionmaker(bind=engine)
    Session = Session_class()
    
    # s1 = Student(name="s2",register_date="2015-03-01",gender="F")
    # Session.add(s1)
    
    print(Session.query(User,Student).filter(User.id==Student.id).all())
    Session.commit()
  • 相关阅读:
    《相约星期二》--[美]米奇·阿尔博姆
    《把信送给加西亚》--[美]阿尔伯特·哈伯德
    《少有人走的路:心智成熟的旅程》--[美]M·斯科特·派克
    《穷爸爸和富爸爸》--[美]罗伯特·清崎,[美]莱希
    Error This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. T
    C#轻量级高性能日志组件EasyLogger
    我们为何要跳槽
    Grid++Report报表工具C/S实战篇(五)
    .NET 开源Protobuf-net从入门到精通
    怎样防止ddos攻击
  • 原文地址:https://www.cnblogs.com/jixuege-1/p/6272888.html
Copyright © 2020-2023  润新知