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()

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

原文地址:https://www.cnblogs.com/bear905695019/p/8520214.html