对象关系映射器将关系数据库系统映射到对象。如果您不熟悉面向对象的编程,请先阅读本教程。ORM 与使用哪个关系数据库系统无关。在 Python 中,您可以与对象对话,ORM 会将其映射到数据库。在本文中,您将学习如何使用 SqlAlchemy ORM。
下图显示了 ORM 的功能:

ORM 对象关系映射。 我们使用 ORM 与数据库进行通信,并且仅使用 Python 对象和类。
创建一个类来填充 ORM
我们创建文件tabledef.py。 在这个文件中,我们将定义一个Student类。 下面是类的抽象可视化:

类定义
请注意,我们没有定义任何方法,仅定义了类的变量。 这是因为我们会将此类映射到数据库,因此不需要任何方法。
这是tabledef.py的内容:
from sqlalchemy import *from sqlalchemy import create_engine, ForeignKeyfrom sqlalchemy import Column, Date, Integer, Stringfrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy.orm import relationship, backrefengine = create_engine('sqlite:///student.db', echo=True)Base = declarative_base()########################################################################class Student(Base):""""""__tablename__ = "student"id = Column(Integer, primary_key=True)username = Column(String)firstname = Column(String)lastname = Column(String)university = Column(String)#----------------------------------------------------------------------def __init__(self, username, firstname, lastname, university):""""""self.username = usernameself.firstname = firstnameself.lastname = lastnameself.university = university# create tablesBase.metadata.create_all(engine)
执行:
python tabledef.py
ORM 创建了数据库文件tabledef.py。 它将 SQL 查询输出到屏幕,在本例中显示为:
CREATE TABLE student (id INTEGER NOT NULL,username VARCHAR,firstname VARCHAR,lastname VARCHAR,university VARCHAR,PRIMARY KEY (id))
因此,当我们定义一个类时,ORM 为我们创建了数据库表。 该表仍然为空。
将数据插入数据库
数据库表仍然为空。 我们可以使用 Python 对象将数据插入数据库。 因为我们使用 SqlAlchemy ORM,所以我们不必编写单个 SQL 查询。 现在,我们只需创建要馈送到 ORM 的 Python 对象。 将下面的代码另存为dummy.py
import datetimefrom sqlalchemy import create_enginefrom sqlalchemy.orm import sessionmakerfrom tabledef import *engine = create_engine('sqlite:///student.db', echo=True)# create a SessionSession = sessionmaker(bind=engine)session = Session()# Create objectsuser = Student("james","James","Boogie","MIT")session.add(user)user = Student("lara","Lara","Miami","UU")session.add(user)user = Student("eric","Eric","York","Stanford")session.add(user)# commit the record the databasesession.commit()
执行:
python dummy.py
ORM 会将 Python 对象映射到关系数据库。 这意味着您无需与应用程序进行任何直接交互,只需与对象进行交互即可。 如果您使用 SQLiteman 或 SQLite 数据库应用程序打开数据库,则会发现该表已创建:

数据表中的数据。
查询数据
我们可以使用以下代码查询表的所有项目。 请注意,Python 将每条记录视为Student类定义的唯一对象。 将代码另存为demo.py
import datetimefrom sqlalchemy import create_enginefrom sqlalchemy.orm import sessionmakerfrom tabledef import *engine = create_engine('sqlite:///student.db', echo=True)# create a SessionSession = sessionmaker(bind=engine)session = Session()# Create objectsfor student in session.query(Student).order_by(Student.id):print student.firstname, student.lastname
执行后,您将看到:
James BoogieLara MiamiEric York
要选择单个对象,请使用filter()方法。 下面的演示:
import datetimefrom sqlalchemy import create_enginefrom sqlalchemy.orm import sessionmakerfrom tabledef import *engine = create_engine('sqlite:///student.db', echo=True)# create a SessionSession = sessionmaker(bind=engine)session = Session()# Select objectsfor student in session.query(Student).filter(Student.firstname == 'Eric'):print student.firstname, student.lastname
输出:
Eric York
最后,如果您不希望 ORM 输出,则任何 SQL 查询的输出都将create_engine语句更改为:
engine = create_engine('sqlite:///student.db', echo=False)
