• Tornado-Lesson06-ORM、SQLAlchemy连接数据库、Module和增删改查


    一、ORM

      ORM全称Object Relational Mapping(对象关系映射)。通过ORM可以不关心后台使用的哪种数据库,只需按照ORM所提供的语法规则去书写相应的代码,ORM就会自动的转换成对应数据库的语句。

    SQLAlchemy是pychon中常用的ORM,本章以SQLAlchemy为例。

    二、SQLAlchemy连接数据库

      1.安装

        linux上安装mysql、python包:pymysql、sqlalchemy.

        pip安装python包:pip install pymsql

                 pip install sqlalchemy

        直接安装比较慢,可以使用国内的源下载安装

                pip install -i https://pypi.douban.com/simple pymsql

                pip install -i https://pypi.douban.com/simple sqlalchemy

      2.导入模块

        from sqlalchemy import create_engine

      3.数据库数据

        HOSTNAME = '192.168.1.104'  #服务器ip注意桥接模式和端口转发模式的区别

        PORT = '3306'        

        DATABASE = 'mydb'

        USERNAME = 'admin'

        PASSWORD = 'Root110qwe'

        

      4.格式化数据库连接url

        db_url = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(

          USERNAME,

          PASSWORD,

          HOSTNAME,

          PORT,

          DATABASE

        )    

      5.连接数据库

        engine = create_engine(db_url)

      6.测试连接

        if __name__ = '__main__':

          connection = engine.connect()

          result = connection.execute('select 1')

          print(result.fetchone())

        运行后,控制台打印以下结果,表示连接成功

        在linux服务器上查询数据库用户信息,显示

        host中%表示允许全部连接方式(本地连接和远程连接);localhost表示只允许本地连接

    三、Module

      使用SQLAlchemy连上数据库之后,接下来我们就在数据库里面新建表。

      对象关系映射,数据库中的表与python中的类对应,必须要创建一个继承自sqlalchemy的基类。

      1.第一步:创建 Module 的 Base 类

        from sqlalchemy.ext.declarative import declarative_base
        Base = declarative_base(engine)

        使用declarative方法定义的映射类依据一个基类,这个类是维系类和数据表关系的目录。

        应用通常只需要有一个Base的实例。我们通过declarative base()来创建一个基类。

      2.第二步:创建表模型Module

        from datetime import datetime
        from sqlalchemy import Column, Integer, String, DateTime
        from connect import Base

        class User(Base):
          __tablename__ = 'user'
          id = Column(Integer, primary_key=True, autoincrement=True)
          username = Column(String(20), nullable=False)
          password = Column(String(50))
          creatime = Column(DateTime, default=datetime.now)

        对象关系映射在这里就是指把数据库的表映射为一个类。

        我们用类来表示数据库里面的表,这些表的类都继承于我们的Base基类。在类里我们定义的属性,通过映射,对应表里面的字段。

      3.第三步:通过主函数调用来创建Module

          Base.metadata.create_all()

     

        运行后可以看到创建了新表user

    四、增删改查

      1.创建会话

        from sqlalchemy.orm import sessionmaker
        Session = sessionmaker(engine)
        session = Session()

        在对数据库表进行操作之前,要先建立会话,建立会话之后才能进行操作,就类似于文件要打开之后才能对文件进行内容操作

      2.导入session和module 

        from connect import session
        from user_module import User

        

      3.写增删改查  

        先以简单的增删改查为例

        添加一条数据和添加N条数据,注意,改变数据库表内容时候要session.commit()提交

        person = User(username = 'wjl', password = 'qwe123')
        session.add(person)

        session.add_all(
          [
            User(username = 'lgj', password = 'aaa'),
            User(username = 'gy', password = 'bbb')
          ]
        )
        session.commit()

        查询第一条数据和查询所有数据
        rows = session.query(User).all()

        rows = session.query(User).first()

        更新数据
        #filter相当于where,条件
        session.query(User).filter(User.id==1).update({User.password:123})
        session.commit()

        删除数据

        rows = session.query(User).filter(User.id==2)[0]
        session.delete(rows)
        session.commit()

        注意:

        以上语句中 session.query(User).filter(User.id==2)

              session.query(User)

        打印显示为sql语句    

          SELECT user.id AS user_id, user.username AS user_username, user.password AS user_password, user.creatime AS user_creatime
          FROM user
          WHERE user.id = %(id_1)s

          SELECT user.id AS user_id, user.username AS user_username, user.password AS user_password, user.creatime AS user_creatime
          FROM user

    以下为本文示例代码

        Module基类:user_module.py

    from datetime import datetime
    from sqlalchemy import Column, Integer, String, DateTime
    from connect import Base
    
    class User(Base):
        __tablename__ = 'user'
        id = Column(Integer, primary_key=True, autoincrement=True)
        username = Column(String(20), nullable=False)
        password = Column(String(50))
        creatime = Column(DateTime, default=datetime.now)
    
        def __repr__(self):
            return '<User(id=%s, username=%s, password=%s, creatime=%s)>' % (
                self.id,
                self.username,
                self.password,
                self.creatime
            )
    
    if __name__ == '__main__':
        Base.metadata.create_all()

        连接数据库类:connect.py

    from sqlalchemy import create_engine
    
    HOSTNAME = '192.168.1.104'
    PORT = '3306'
    DATABASE = 'mydb'
    USERNAME = 'admin'
    PASSWORD = 'Root110qwe'
    
    db_url = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(
        USERNAME,
        PASSWORD,
        HOSTNAME,
        PORT,
        DATABASE
    )
    
    engine = create_engine(db_url)
    
    #创建Module的基类Base
    from sqlalchemy.ext.declarative import  declarative_base
    Base = declarative_base(engine)
    
    #要进行数据库操作,先要创建会话
    from sqlalchemy.orm import sessionmaker
    Session = sessionmaker(engine)
    session = Session()
    
    if __name__ == '__main__':
        connection = engine.connect()
        result = connection.execute('select 1')
        print(result.fetchone())

        数据库操作类:test_module.py

    from connect import session
    from user_module import User
    
    def add_user():
        person = User(username = 'wjl', password = 'qwe123')
        session.add(person)
    
        session.add_all(
            [
                User(username = 'lgj', password = 'aaa'),
                User(username = 'gy', password = 'bbb')
            ]
        )
        session.commit()
    
    def search_user():
        rows = session.query(User).all()
        print(rows);
    
        rows = session.query(User).first()
        print(rows);
    
    def update_user():
        #filter相当于where,条件
        session.query(User).filter(User.id==1).update({User.password:123})
        session.commit()
    
    def delete_user():
        rows = session.query(User).filter(User.id==2)[0]
        session.delete(rows)
        session.commit()
        print(rows)
    
    
    
    if __name__ == '__main__':
        # add_user()
        search_user()
        update_user()
        delete_user()

      由此实现对数据库简单的增删改查

  • 相关阅读:
    Disruptor详细介绍之快速入门
    Java魔法类:sun.misc.Unsafe
    Java开源框架推荐
    CAS(Compare and Swap)无锁算法之volatile不能保证原子性而Atomic可以
    数据库乐观锁、悲观锁、共享锁、排它锁、行锁、表锁概念的理解
    Linux上查找线程使用的CPU时间最长
    虚拟机内存结构
    插入排序和归并排序(算法学习1)
    POJ-2942:吃糖果
    POJ-4004:数字组合(用位移方法解组合数问题,Java版)
  • 原文地址:https://www.cnblogs.com/bear905695019/p/8520214.html
Copyright © 2020-2023  润新知