美文网首页
SQLAlchemy ORM学习笔记

SQLAlchemy ORM学习笔记

作者: KaiW | 来源:发表于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学习笔记

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

  • 2018-06-05 sqlalchemy

    此文档为个人笔记,完整的请查看官方文档。摘自SQLAlchemy ORM当前使用的sqlalchemy版本为1.1...

  • SQLALchemy-查询篇

    似乎ORM最难设计的部分是查询。特别是面向对象的查询,今天学习SQLAlchemy,发现SQLAlchemy的查询...

  • 2018-02-09

    Python数据库编程 ORM-SQLAlchemy学习 一、ORM背景介绍 如果写程序用pymysql和程序交互...

  • python-Flask_SQLAlchemy(1)

    数据库SQLAlchemy [TOC] SQLAlchemy介绍 flask_sqlalchemy是一套ORM框架...

  • Sqlalchemy ORM

    本文主要Sqlalchemy的ORM components进行介绍参考:SQLAlchemy 1.4 Docume...

  • SQLAlchemy

    ORM与SQLAlchemy简介 ORM 全称 Object Relational Mapping, 翻译过来叫对...

  • Python操作三大数据库(2)-ORM操作MySQL

    ORM的主要实现方式 SqlObject peewee Django's ORM SQLAlchemy SQLAl...

  • [提炼&总结]ORM连接ODM

    ORM:Object Relational Mapping。比较著名的有Django的ORM,SQLAlchemy...

  • python使用sqlalchemy连接mysql数据库

    sqlalchemy是python当中比较出名的orm程序。 什么是orm? orm英文全称object rela...

网友评论

      本文标题:SQLAlchemy ORM学习笔记

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