
SQLAlchemy是Python世界中最广泛使用的ORM框架,可以说是访问数据库事实上的标准库。
为什么要使用SQLAlchemy?
SQLAlchemy底层对数据库表以及表关系的定义,数据库的操作做了封装,使得开发人员可以用python代码来和数据库交互,比起传统的sql语句来说要方便许多。
除此之外,SQLAlchemy还可以和主流的web框架flask,django无缝整合。
本文通过一个实际的例子来介绍SQLAlchemy ORM的使用方法。
安装
- 安装数据库驱动,例如:mysql驱动。
pip install PyMySQL
如果要支持python3,则必须要安装PyMySQL。
- 安装 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)
解释说明:
-
declarative_base是SQLAlchemy 定义python 类于数据库表关联的基类,所有的数据库表字段,关联等数据信息都在declarative_base内注册实现。
-
Column 为对数据库表字段抽象,可以定义各种数据类型。此外还可以定义主键primary_key=True,索引index,nullable是否允许null,default默认值等等。
-
关系映射是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)
-
engine 是SQLAlchemy对数据库连接的抽象,其中包含数据库的连接和连接池的管理。
-
Base类的metadata来帮我们自动创建数据库表。
网友评论