zoukankan      html  css  js  c++  java
  • sqlalchemy orm 操作 MySQL

    一、ORM介绍

    orm英文全称object relational mapping,是对象映射关系程序,简单来说类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的,为了保证一致的使用习惯,通过orm将编程语言的对象模型和数据库的关系模型建立映射关系,这样我们在使用编程语言对数据库进行操作的时候可以直接使用编程语言的对象模型进行操作就可以了,而不用直接使用SQL语言。

    orm的优点:
    隐藏了数据访问细节,“封闭”的通用数据库交互,ORM的核心。使得我们与数据库交互变得简单易行,并且完全不用考虑的SQL语句。快速开发,由此而来。
    ORM使我们构造固化数据结构变得简单易行。

    缺点:
    无可避免的,自动化意味着映射和关联管理,代价是牺牲性能(早期,这是所有不喜欢ORM人的共同点)。现在的各种ORM框架都在尝试使用各种方法来减轻这块(LazyLoad,Cache),效果还是很显著的。

    安装:
    pip install sqlalchemy #也可以去下轮子安装,最近pypi不太好上
    pip install pymysql

    二、使用

    2.1 在数据库中,当我们要建一个表时:

    create table tablename (
        field_id integer not null auto_increment,
        field2 char(32) not null,
        field3 varchar(64),
        primary key (field_id));
    

    写了一个简单的SQL语句,但是还有插入数据啊、查询啊、连表查询啊、增删改查等等,既然学到了orm也知道写SQL语句有多痛苦了
    那我们用sqlalchemy来写一个吧!
    sqlalchemy连接数据库语句:Python下使用 mysql+pymysql
    mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]

    from sqlchemy import create_engine
    from sqlchemy.ext.declarative import declarative_base
    from sqlchemy import Integer, String, Column, ForeignKey
    from sqlchemy.orm import sessionmaker
    
    engine = create_engine("mysql+pymysql://user_name:password@localhost/data_base_name",
                   encoding='utf-8', echo= True)
    
    Base = declarative_base()
    
    class User(Base):             #1以下就是创建一个userinfo表了
        __tablename__ = 'userinfo'
        uid = Column(Integer, primary_key= True)
        name = Column(String(32))
        password = Column(String(64))
        create_time = Column(String(64))
    
        def __repr__(self):
            return "<uid: {0} name: {1}".format(self.uid, self.name)
    
    Base.metadata.create_all(engine)     #2在引擎上创建表
    

    2的语句,这样就把我们在orm中的表远程连接到数据库,创建到database中了。

    另一种创建方式,看看就好。

    from sqlalchemy import Table, MetaData, Column, Integer, String, ForeignKey
    from sqlalchemy.orm import mapper
    
    metadata = MetaData()
    
    user = Table('user', metadata,
                Column('id', Integer, primary_key=True),
                Column('name', String(50)),
                Column('fullname', String(50)),
                Column('password', String(12))
            )
    
    class User(object):
        def __init__(self, name, fullname, password):
            self.name = name
            self.fullname = fullname
            self.password = password
    
    mapper(User, user)
    

    三、增删改查

    3.1 增
    在orm里面进行操作都需要一个类似cusor的游标,这样来创建:
    from sqlalchemy.orm import sessionmaker 引入该模块
    Session_class = sessionmaker(bind= engine) 绑定engine ,会返回给你一个session类。注意这是个类
    session = Session_class() 这样都得到了游标了
    创建一条数据:

    import time
    time_now = time.time()      #拿到当前的时间戳
    user_obj = User(name= 'lina', password= '123456789', create_time= str(time_now))
    session.add(user_obj)      #将user_obj对象添加到事务中
    

    注意:sqlalchemy默认开启事务所以这样还没成功,接下来:
    session.commit() 只需要commit一下就好了,session还有个session.rollback()回滚函数,当你操作失败就自动调用了

    3.2 查
    条件查询:
    list_user_obj = session.query(User).filter_by(name= 'lina').all() 这样我们就查询到了,通过.all()方法会返回所有User表里面name= 'lina'的对象组成一个列表,用.first()就只返回一个对象了
    还有一个filter方法,不太建议,用法为参数要变为session.query(User).filter(User.name = name)变成User中的name对象
    一般filter用在:模糊查询(统计)、多条件查询:
    session.query(User).filter(User.name.like('li%')).count() 模糊查询,并通过.count()统计 session.query(User).filter(User.uid>2).filter(User.uid<5).all()`

    分组
    from sqlalchemy import func
    session.query(func.count(User.name),User.name).group_by(User.name).all()
    相当于原生sql为

    select count(user.name) AS count_1, user.name AS user_name
    FROM user GROUP BY user.name

    3.3 改
    user_obj = session.query(User).filter_by(name="lina").first() #查询想要修改的数据

    user_obj.name = "david" #通过查询到的对象来修改对象中的属性

    session.commit() #将修改后的对象comiit就完成一次修改了

    3.4 删
    查询到要删除的条数据,或者多个对象,直接调用session.delete(obj)然后提交一下就好了
    obj = session.query(User).filter(User.name.like('%na').all()
    session.delete(obj)
    session.commit()

  • 相关阅读:
    超棒的jQuery矢量地图生成插件 JQVAMP
    签名一年过期 项目导入出现 红叉叉
    invalid commandline parameter: Files\Android\androidsdk\tools/emulatorarm.exe 错误
    线性布局 相对布局 参数
    触摸事件 按下 移动 弹起
    Activity service 通信
    android view的setVisibility方法值的意思
    TextView 支持 html 图片显示
    布局动态添加 相对布局
    存储数据 SharedPreferences
  • 原文地址:https://www.cnblogs.com/shiqi17/p/9368521.html
Copyright © 2011-2022 走看看