tornado的ORM

tornado的ORM


  • 安装sqlalchemy和pymysql
    • pip install sqlalchemy
    • pip install pymysql
  • 连接数据库
    •  1 from sqlalchemy import create_engine
       2 
       3 
       4 
       5 config = {
       6     'HOST': '',
       7     'USERNAME': '',
       8     'PASSWORD': '',
       9     'PORT': '',
      10     'DATABASE': '',
      11     'PARAMS': ''
      12 }
      13 
      14 
      15 DB_URL = 'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOST}:{PORT}/{DATABASE}?{PARAMS}'
      16 
      17 engine = create_engine(DB_URL.format(**config))
      18 
      19 
      20 
      21 if __name__ == '__main__':
      22     conc = engine.connect()
      23     result = conc.execute('select 1')
      24     print(result.fetchone())

      如果连接成功,则控制台会出现(1,)的结果


  • 数据库建模
    • 建立base类
       1 from sqlalchemy import create_engine
       2 from sqlalchemy.ext.declarative import declarative_base
       3 
       4 
       5 config = {
       6     'HOST': '',
       7     'USERNAME': '',
       8     'PASSWORD': '',
       9     'PORT': '',
      10     'DATABASE': '',
      11     'PARAMS': ''
      12 }
      13 
      14 
      15 DB_URL = 'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOST}:{PORT}/{DATABASE}?{PARAMS}'
      16 
      17 engine = create_engine(DB_URL.format(**config))
      18 
      19 Base = declarative_base(engine)
    • 使用base类并建立表格
       1 from settings import Base
       2 from sqlalchemy import Column, Integer, String, DateTime, Boolean
       3 from datetime import datetime
       4 
       5 
       6 class User(Base):
       7     __tablename__ = 'user'  # 指定表名
       8     id = Column(Integer, autoincrement=True, primary_key=True)
       9     username = Column(String(20))
      10     password = Column(String(20))
      11     create_time = Column(DateTime, default=datetime.now())
      12     is_login = Column(Boolean, default=False, nullable=False)
      13 
      14 
      15 
      16 
      17 if __name__ == '__main__':
      18     Base.metadata.create_all()  # 创建表格

      创建的表名必须为该类的__tablename__属性,Colum新建一个字段,然后给Colum传参来进行约束

    • Column的常用参数:
      • default: 默认值,可以传一个函数体,default的值等于这个函数体执行后返回的值
      • nullable:是否可为空
      • primary_key:是否为主键
      • unique: 是否唯一
      • autoincrement: 是否自增长
      • onupdate: 更新的时候执行的函数,和default一样,可以传一个函数体
      • name: 该属性在数据库中的字段的映射,默认是属性名 
    • 常用的数据类型
      • Integer: 整形
      • Float: 浮点类型
      • Boolean:布尔
      • DECIMAL: 定点类型: DECIMAL第一个参数为整数位的个数,第二位参数为小数位的个数
      • Enum:枚举类型: Enum可以借助python3自带的enum包来实现更加简便
      • Date: 传递datetime.date()
      • DateTime: 传递datetime.datetime()
      • Time:传递datetime.time() 进去
      • String: 字符串型, 使用时需要制定长度
      • Text: 文本类型
      • LONGTEXT: 长文本类型
  • 简单的增删改查
      •  1 from sqlalchemy import create_engine
         2 from settings import DB_CONFIG
         3 from sqlalchemy.ext.declarative import declarative_base
         4 from sqlalchemy.orm import sessionmaker
         5 
         6 
         7 DB_URL = 'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOST}:{PORT}/{DATABASE}?{PARAMS}'
         8 
         9 engine = create_engine(DB_URL.format(**DB_CONFIG))
        10 
        11 Base = declarative_base(engine)
        12 
        13 Session = sessionmaker(engine)
        14 
        15 session = Session()

        与上面不同的是,新建了一个Session对象,然后将这个对象实例化,接下来的数据库操作都用到这个实例对象来操作

      •  1 from config import Base
         2 from sqlalchemy import Column, Integer, String, DateTime, Boolean
         3 from datetime import datetime
         4 
         5 class User(Base):
         6     __tablename__ = 'user'
         7     id = Column(Integer, primary_key=True, autoincrement=True)
         8     username = Column(String(20))
         9     password = Column(String(20))
        10     create_time = Column(DateTime, default=datetime.now())
        11     is_login = Column(Boolean, default=False, nullable=False)
        12 
        13

        表结构

      •  1 from wechat import User
         2 from config import session
         3 
         4 def add():
         5     user = User(username='ivy', password='123456')
         6     session.add(user)
         7     session.commit()
         8 
         9 
        10 if __name__ == '__main__':
        11     add()

        添加一条

      •  1 from wechat import User
         2 from config import session
         3 
         4 def add():
         5 
         6     session.add_all([
         7         User(username='ivy', password='123456'),
         8         User(username='ivy1', password='123456'),
         9         User(username='ivy2', password='123456'),
        10     ])
        11     session.commit()
        12 
        13 
        14 if __name__ == '__main__':
        15     add()

        添加多条

      •  1 from wechat import User
         2 from config import session
         3 
         4 def search():
         5     session.query(User).all()  # 查找所有
         6     result = session.query(User).first().username  # 查找第一个
         7     result = session.query(User).filter(User.username=='ivy').first().password
         8     print(result)
         9 
        10 
        11 
        12 if __name__ == '__main__':
        13     search()
      •  1 from wechat import User
         2 from config import session
         3 
         4 
         5 def update():
         6     session.query(User).filter(User.username == 'ivy').update(
         7         {
         8             User.username: 'bob',
         9             User.password: '123654',
        10         }
        11     )
        12     session.commit()
        13 
        14 
        15 if __name__ == '__main__':
        16     update()

        更改的数据以字典的键值对的形式传入

      •  1 from wechat import User
         2 from config import session
         3 
         4 
         5 def delete():
         6     result = session.query(User).filter(User.username == 'bob').first()
         7 
         8     session.delete(result)
         9     session.commit()
        10 
        11 
        12 if __name__ == '__main__':
        13     delete()

        先查询结果,再讲查询的结果删除,如果查询的结果为空,则删除会报错。

    •  每个session执行完毕之后都要close()
原文地址:https://www.cnblogs.com/ivy-blogs/p/10820896.html