美文网首页
SQLAlchemy ORM学习笔记

SQLAlchemy ORM学习笔记

作者: snow4web | 来源:发表于2018-12-28 17:21 被阅读94次
    sqlalchemy.png

    SQLAlchemy是Python世界中最广泛使用的ORM框架,可以说是访问数据库事实上的标准库。

    为什么要使用SQLAlchemy?


    SQLAlchemy底层对数据库表以及表关系的定义,数据库的操作做了封装,使得开发人员可以用python代码来和数据库交互,比起传统的sql语句来说要方便许多。

    除此之外,SQLAlchemy还可以和主流的web框架flask,django无缝整合。

    本文通过一个实际的例子来介绍SQLAlchemy ORM的使用方法。

    安装


    1. 安装数据库驱动,例如:mysql驱动。
    pip install PyMySQL
    

    如果要支持python3,则必须要安装PyMySQL。

    1. 安装 python包
    pip install SQLAlchemy
    

    定义映射


    这个例子是一个简化的电商订单系统数据库模型,主要用于下单购买饼干,其中cookie是产品饼干,order为订单,user为用户,LineItem为订单项。

    from datetime import datetime
    
    from sqlalchemy import Column, Integer, Numeric, String, DateTime, ForeignKey, Boolean
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import relationship, backref
    
    
    Base = declarative_base()
    
    
    class Cookie(Base):
        __tablename__ = 'cookies'
    
        cookie_id = Column(Integer, primary_key=True)
        cookie_name = Column(String(50), index=True)
        cookie_recipe_url = Column(String(255))
        cookie_sku = Column(String(55))
        quantity = Column(Integer())
        unit_cost = Column(Numeric(12, 2))
        
        def __repr__(self):
            return "Cookie(cookie_name='{self.cookie_name}', " \
                           "cookie_recipe_url='{self.cookie_recipe_url}', " \
                           "cookie_sku='{self.cookie_sku}', " \
                           "quantity={self.quantity}, " \
                           "unit_cost={self.unit_cost})".format(self=self)
        
        
    class User(Base):
        __tablename__ = 'users'
        
        user_id = Column(Integer(), primary_key=True)
        username = Column(String(15), nullable=False, unique=True)
        email_address = Column(String(255), nullable=False)
        phone = Column(String(20), nullable=False)
        password = Column(String(25), nullable=False)
        created_on = Column(DateTime(), default=datetime.now)
        updated_on = Column(DateTime(), default=datetime.now, onupdate=datetime.now)
        
        def __repr__(self):
            return "User(username='{self.username}', " \
                         "email_address='{self.email_address}', " \
                         "phone='{self.phone}', " \
                         "password='{self.password}')".format(self=self)
        
    
    class Order(Base):
        __tablename__ = 'orders'
        order_id = Column(Integer(), primary_key=True)
        user_id = Column(Integer(), ForeignKey('users.user_id'))
        shipped = Column(Boolean(), default=False)
        
        user =  relationship("User", backref=backref('orders', order_by=order_id))
        
        def __repr__(self):
            return "Order(user_id={self.user_id}, " \
                          "shipped={self.shipped})".format(self=self)
    
    
    class LineItem(Base):
        __tablename__ = 'line_items'
        line_item_id = Column(Integer(), primary_key=True)
        order_id = Column(Integer(), ForeignKey('orders.order_id'))
        cookie_id = Column(Integer(), ForeignKey('cookies.cookie_id'))
        quantity = Column(Integer())
        extended_cost = Column(Numeric(12, 2))
        
        order = relationship("Order", backref=backref('line_items', order_by=line_item_id))
        cookie = relationship("Cookie", uselist=False)
    
        def __repr__(self):
            return "LineItems(order_id={self.order_id}, " \
                              "cookie_id={self.cookie_id}, " \
                              "quantity={self.quantity}, " \
                              "extended_cost={self.extended_cost})".format(
                        self=self)    
        
    

    解释说明:

    1. declarative_base是SQLAlchemy 定义python 类于数据库表关联的基类,所有的数据库表字段,关联等数据信息都在declarative_base内注册实现。

    2. Column 为对数据库表字段抽象,可以定义各种数据类型。此外还可以定义主键primary_key=True,索引index,nullable是否允许null,default默认值等等。

    3. 关系映射是orm最为核心的配置。
      sqlalchemy使用ForeignKey来指明一对多的关系,比如一个用户可有多个订单,而一个订单只属于一个用户。那么就是典型的一对多或多对一关系。
      relationship 可以定义关联的对象属性,如订单项LineItem类

        order = relationship("Order", backref=backref('line_items', order_by=line_item_id))
    

    定义了 order属性,backref定义了 order订单对象如何访问订单项目。

    连接数据库,创建表结构


    from sqlalchemy import create_engine
    Base = declarative_base()
    engine = create_engine('sqlite:///:memory:')
    Base.metadata.create_all(engine)
    
    1. engine 是SQLAlchemy对数据库连接的抽象,其中包含数据库的连接和连接池的管理。

    2. Base类的metadata来帮我们自动创建数据库表。

    参考:


    官方doc
    python-sqlalchemy-sheeet

    相关文章

      网友评论

          本文标题:SQLAlchemy ORM学习笔记

          本文链接:https://www.haomeiwen.com/subject/ayrelqtx.html