SQLAlchemy ORM学习笔记

2018-12-28  本文已影响94人  KaiW
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

上一篇 下一篇

猜你喜欢

热点阅读