zoukankan      html  css  js  c++  java
  • sqlalchemy ORM

    本节内容
     
        ORM介绍
        sqlalchemy安装
        sqlalchemy基本使用
        多外键关联
        多对多关系
     
    1. ORM介绍
     
    orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的,为了保证一致的使用习惯,通过orm将编程语言的对象模型和数据库的关系模型建立映射关系,这样我们在使用编程语言对数据库进行操作的时候可以直接使用编程语言的对象模型进行操作就可以了,而不用直接使用sql语言。
     
    orm的优点:
     
        1:隐藏了数据访问细节,“封闭”的通用数据库交互,ORM的核心。他使得我们的通用数据库交互变得简单易行,并且完全不用考虑该死的SQL语句。快速开发,由此而来。
        2:ORM使我们构造固化数据结构变得简单易行。
     
    缺点:
     
        无可避免的,自动化意味着映射和关联管理,代价是牺牲性能(早期,这是所有不喜欢ORM人的共同点)。现在的各种ORM框架都在尝试使用各种方法来减轻这块(LazyLoad,Cache),效果还是很显著的。
     
    2. sqlalchemy安装
     
    在Python中,最有名的ORM框架是SQLAlchemy。用户包括openstack\Dropbox等知名公司或应用,主要用户列表http://www.sqlalchemy.org/organizations.html#openstack
     
    Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如:
     
    MySQL-Python
        mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>
     
    pymysql
        mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]
     
    MySQL-Connector
        mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>
     
    cx_Oracle
        oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]
     
    更多详见:http://docs.sqlalchemy.org/en/latest/dialects/index.html
     
    安装sqlalchemy
     
    pip install SQLAlchemy<br><br>pip install pymysql  #由于mysqldb依然不支持py3,所以这里我们用pymysql与sqlalchemy交互
     
    3.sqlalchemy基本使用
     
    没有用到orm 之前,我们创建一个表是这样的
     
    CREATE TABLE user (
        id INTEGER NOT NULL AUTO_INCREMENT,
        name VARCHAR(32),
        password VARCHAR(64),
        PRIMARY KEY (id)
    )
     
    这只是最简单的sql表,如果再加上外键关联什么的,一般程序员的脑容量是记不住那些sql语句的,于是有了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:123456@192.168.1.20/test",
                           encoding='utf-8',echo=True)
     
    engine = create_engine("mysql+pymysql://root:123456@192.168.1.20:5621/test",
                           encoding='utf-8',echo=True)    #MySQL数据库默认端口是3306如果不是默认端口的话需要指定端口号
     
     
    Base = declarative_base() #生成orm基类
     
    class User(Base):
        __tablename__ = 'user' #表名
        id = Column(Integer, primary_key=True)
        name = Column(String(32))
        password = Column(String(64))
     
        def __repr__(self):
            return "<User(name='%s',  password='%s')>" % (
                self.name, self.password)
     
    Base.metadata.create_all(engine) #创建表结构
     
    登录MySQL查看和验证表是否创建成功
    mysql> use test;
    Database changed
    mysql> show tables;
    +----------------+
    | Tables_in_test |
    +----------------+
    | user           |
    +----------------+
    1 row in set (0.00 sec)
    mysql> show create table userG
    *************************** 1. row ***************************
           Table: user
    Create Table: CREATE TABLE `user` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(32) DEFAULT NULL,
      `password` varchar(64) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    1 row in set (0.04 sec)
     
    最基本的表我们创建好了,那我们开始用orm创建一条数据试试
    Session_class = sessionmaker(bind=engine) #创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例
    Session = Session_class() #生成session实例
     
     
    user_obj = User(name="jim",password="aa")  #生成你要创建的数据对象
    print(user_obj.name,user_obj.id)  #此时还没创建对象呢,不信你打印一下id发现还是None
     
    Session.add(user_obj) #把要创建的数据对象添加到这个session里, 一会统一创建
    print(user_obj.name,user_obj.id) #此时也依然还没创建
     
    Session.commit() #现此才统一提交,创建数据
     
    登录MySQL查看和验证数据是否插入创建成功
    mysql> select * from user;
    +----+------+----------+
    | id | name | password |
    +----+------+----------+
    |  1 | jim  | aa       |
    +----+------+----------+
    1 row in set (0.00 sec)
     
    查询
    my_user = Session.query(User).filter_by(name="jim").first()
    print(my_user.id,my_user.name,my_user.password)
     
    结果为:
    2016-10-24 16:48:50,249 INFO sqlalchemy.engine.base.Engine {'name_1': 'jim', 'param_1': 1}
    1 jim aa
     
    修改
    my_user = Session.query(User).filter_by(name="jim").first()
    my_user.name = "tom"
    Session.commit()
    print(my_user.id,my_user.name,my_user.password)
     
    结果为:
    2016-10-26 16:46:38,043 INFO sqlalchemy.engine.base.Engine {'param_1': 1}
    1 tom aa
     
    回滚
    my_user = Session.query(User).filter_by(id=1).first()
    my_user.name = "Jack"
     
    fake_user = User(name='Rain', password='12345')
    Session.add(fake_user)
     
    print(Session.query(User).filter(User.name.in_(['Jack','rain'])).all() )  #这时看session里有你刚添加和修改的数据
     
    Session.rollback() #此时你rollback一下
     
    print(Session.query(User).filter(User.name.in_(['Jack','rain'])).all() ) #再查就发现刚才添加的数据没有了。
     
    获取所有数据
    print(Session.query(User.name,User.id).all() )
    结果为:
    [('tom', 1), ('tom', 2), ('tom', 3), ('tom', 4), ('tom', 5), ('tom', 6), ('jim', 7), ('jim', 8), ('jim', 9)]
     
    多条件查询
    objs = Session.query(User).filter(User.id>0).filter(User.id<7).all()
    print(objs)
    结果为:
    [<User(name='tom',  password='aa')>, <User(name='tom',  password='aa')>, <User(name='tom',  password='aa')>, <User(name='tom',  password='aa')>, <User(name='tom',  password='aa')>, <User(name='tom',  password='aa')>]
     
     
    统计
    objs = Session.query(User).filter(User.name.like("jim%")).count()
    结果为:
    print(objs)
    2016-10-27 16:52:48,006 INFO sqlalchemy.engine.base.Engine {'name_1': 'jim%'}
    3
     
    分组
    from sqlalchemy import func
    print(Session.query(func.count(User.name),User.name).group_by(User.name).all() )
    结果为:
    2016-10-27 16:50:28,874 INFO sqlalchemy.engine.base.Engine {}
    [(3, 'jim'), (6, 'tom')]
  • 相关阅读:
    转dhdhtmlxTree
    转Merge的用法
    解决SqlServer2008评估期过期
    借鉴一下对比算法
    Asp.Net异常:"由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值"的解决方法
    查看Windows下引起Oracle CPU占用率高的神器-qslice
    今日有奖活动一览
    【分享】给做技术的战友们推荐一个不错的微信公号解解闷
    Unreal Engine Plugin management
    当在ECLIPSE中import现存项目时,如遇到版本不符
  • 原文地址:https://www.cnblogs.com/manger/p/6006866.html
Copyright © 2011-2022 走看看