zoukankan      html  css  js  c++  java
  • SQLAlachemy ORM 初识

    SQLAlachemy

    简介 : 是一个ORM的库
    

    安装

    pip install sqlalchemy
    

    简单使用

    # 导入 sqlalchemy
    from sqlalchemy import Column,String,create_engine
    from sqlalchemy.orm import sessionmaker
    from sqlalchemy.ext.declarative import declarative_base
    
    # 创建对象基类
    Base = declarative_base()
    
    # 定义User表对象
    class User(Base):
        __tablename__ ='user'
    
        # 表结构
        id = Column(String(20),primary_key=True)  # 字符长度20 ,主键
        name = Column(String(20))
    
    # 初始化数据库链接
    
    engine = create_engine('mysql+mysqlconnector://root:password@locahost:3306/test')
    # '数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名'
    # 解释:  'mysql+mysqlconnector://root:password@locahost:3306/test'
    #  mysql -->数据库类型
    # mysqlconnector --> 数据库连接驱动
    # root --> 数据库用户
    # password --> 数据库密码
    # localhost --> ip地址
    # test --> 数据名称
    
    # 创建DBSession , 绑定引擎: -->建立数据库链接类
    DBSession = sessionmaker(bind=engine,)
    
    # 创建session 连接对象
    session = DBSession() # 实例化一个链接,可以使用 单例模式,保证只有一个链接存在
    
    # 创建user对象
    new_user = User(id='5',name='Bob')
    
    # 添加session链接中
    session.add(new_user)
    
    # 提交即保存到数据库中
    session.commit()
    
    # 关闭链接
    session.close()
    
    

    查询数据

    #### 查询数据
    # 1. 建立数据库链接
    session2 = DBSession()
    # 2. 创建Query查询, filter是where条件, one()获取一个数据,all()获取全部数据
    user = session2.query(User).filter(User.id=='5').one()
    print(type(user)) # <class '__main__.User'>
    print (user.name) # Bob
    

    一对多,多对多

    # 一对多 , 多对多
    class User(Base):
        __tablename__ = 'user'
        id = Column(String(20), primary_key=True)
        name = Column(String(20))
    
        # 一对多
        books = relationship('Book')
    
    
    class Book(Base):
        __tablename__ = 'book'
        id = Column(String(20), primary_key=True)
        name = Column(String(20))
        # '多'的一方
        user_id = Column(String(20),ForeignKey=('user.id'))
        
    

    ORM字段

    String   str   字符 
    
    Integer  int   整型
    
    BigInterger int 长整型
    
    Float    float 浮点型, 当参数asdecimal=True时,强制转换成decimal.Decimal类型
    
    Boolean  bool  布尔
    
    Text     str   可变大小的字符串类型
    
    Date     datetime.date  日期类型
    
    Time     date  time.time  时间戳类型
    
    Date Time datetime.datetime  格式化时间,年月日时分秒
    
    Interval  datetime.timedelta 处理 datetime.timedelta对象,时间计算
    
    LargeBinary binary 大型二进制字节数据
    
    Numeric 默认是decimal.Decimal类型,asdecimal=False时转float 固定精度数字的类型
    
    Pickle Type  pickle.dumpls 序列化二进制字段
    
    Array  数组
    
    Unicode  unicode 可变长度的Unicode字符串类型
    
    UnicodeText  unicode  不限长度
    
    Enum     python的任何对象 枚举类型 # 不常用
    # 枚举例子:
    import enum 
    class MyEnum(enum.Enum):
    	one = 1
    	two = 2
    
    t = Table('data',MetaDate(),Column('value',Enum(MyEnum)))
    connection.execute(t.insert(),{
    	'value':MyEnum.two
    })
    # 断言去判断值是否相等
    assert connection.scalar(t.select()) is MyEnum.two
    
    
    

    orm常用参数

    primary_key  布尔类型  主键
    unique       布尔类型  唯一
    index        布尔类型  索引
    nullable     布尔类型  允许为空
    default      默认值
    

    ORM常用关系

    backref     在关系的另一模型中添加反向引用
    
    primary join  明确指定两个魔性之间使用的联结条件
    
    uselist   如果为False , 不是用列表,使用标量值
    
    order_by   指定关系中记录的排序方式
    
    secondary  指定多对多种关系表的名字
    
    secondary join  当SQLAlchemy无法自行决定时,指定多对多关系中的二级联结条件
    
    relationshio  一对多关系
    
    # 示例
    class Role(db.Model):
        __tablename__ = 'roles'
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(64))
        user = db.relationship('User', backref='role')
    
        def __repr__(self):
            return '<Role %r>' % self.name
    
    
    class User(db.Model):
        __tablename__ = 'users'
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(64), unique=True, index=True)
        email = db.Column(db.String(64), unique=True)
        pswd = db.Column(db.String(64))
        role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
    
        def __repr__(self):
            return 'User:%s' % self.name
    

    ORM的方法

    filter_by(name='ed') # 按照字段查询,关键字阐述
    
    filter()   # 自定义条件
    
    first()   # 第一个
    
    add_all()   # 批量添加数据
    
    dirty   # 查看修改的数据
    
    new     # 查看修改后的所有数据
    
    commit() # 提交保存
    
    rollback() # 回滚
    
    order_by(User.id) # 排序
    
    query() # 查询  返回元祖数据
    
    query(User.name.label('name_label')) # 给查询的字段附上变量名
    
    
    aliased() # 给表附上名字, 通过query查询时,可以使用
    user_alias = aliased(User, name='user_alias')
    for row in session.query(user_alias, user_alias.name).all()
    	print(row.user_alias)
    
    # in_  条件搜索
    .filter(User.name.in_(['Edwardo', 'fakeuser']))
    
    
    

    ORM查询方法

    filter()使用的:

    • == ---> ColumnOperators.__eq__()

      query.filter(User.name == 'ed')
      
    • != ---> ColumnOperators.__ne__()

      query.filter(User.name != 'ed')
      
    • like --->ColumnOperators.like()

      query.filter(User.name.like('%ed%'))
      
    • ilike ---> ColumnOperators.ilike()

      query.filter(User.name.ilike('%ed%'))
      
    • in_ ---> ColumnOperators.in_()

      query.filter(User.name.in_(['ed', 'wendy', 'jack']))
      
      # works with query objects too:
      query.filter(User.name.in_(
          session.query(User.name).filter(User.name.like('%ed%'))
      ))
      
      # use tuple_() for composite (multi-column) queries
      from sqlalchemy import tuple_
      query.filter(
          tuple_(User.name, User.nickname).
          in_([('ed', 'edsnickname'), ('wendy', 'windy')])
      )
      

    开启sqlAlachemy新窗口

    # 实例 , 根据实际情况修改
    from sqlalchemy import create_engine
    from sqlalchemy.orm import sessionmaker
    
    from models import 表名
    
    engine = create_engine('postgresql+psycopg2://数据库帐号:密码@localhost:8888/数据库名称')
    DBSession = sessionmaker(bind=engine, )
    
    eg_dict = {"k":"v"} # 额外参数
    
    session = DBSession()
    growth_list = session.query(表名).filter(表母名.字段.in_(eg_dict.get('k')),
           
    
  • 相关阅读:
    【Spring学习笔记-MVC-6】SpringMVC 之@RequestBody 接收Json数组对象
    【Spring学习笔记-MVC-1.1--】@PathVariable与@RequestParam、@CookieValue等比较
    【Oracle学习笔记-1】Win7下安装Oracle 10g
    【Oracle学习笔记-3】关于Oracle 10g中各种服务解析
    【前端编程-学习-5】系统加载提示
    【EasyUI学习-3】Easyui tabs入门实践
    【EasyUI学习-2】Easyui Tree的异步加载
    【Hibernate学习笔记-6.1】无连接表的N-1关联(单向)
    ArcGIS 要素合并
    Nginx 链接
  • 原文地址:https://www.cnblogs.com/dengz/p/14754320.html
Copyright © 2011-2022 走看看