原文: https://pythonspot.com/orm-with-sqlalchemy

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

下图显示了 ORM 的功能:

SqlAlchemy 和 ORM - 图1

ORM 对象关系映射。 我们使用 ORM 与数据库进行通信,并且仅使用 Python 对象和类。

创建一个类来填充 ORM

我们创建文件tabledef.py。 在这个文件中,我们将定义一个Student类。 下面是类的抽象可视化:

SqlAlchemy 和 ORM - 图2

类定义

请注意,我们没有定义任何方法,仅定义了类的变量。 这是因为我们会将此类映射到数据库,因此不需要任何方法。

这是tabledef.py的内容:

  1. from sqlalchemy import *
  2. from sqlalchemy import create_engine, ForeignKey
  3. from sqlalchemy import Column, Date, Integer, String
  4. from sqlalchemy.ext.declarative import declarative_base
  5. from sqlalchemy.orm import relationship, backref
  6. engine = create_engine('sqlite:///student.db', echo=True)
  7. Base = declarative_base()
  8. ########################################################################
  9. class Student(Base):
  10. """"""
  11. __tablename__ = "student"
  12. id = Column(Integer, primary_key=True)
  13. username = Column(String)
  14. firstname = Column(String)
  15. lastname = Column(String)
  16. university = Column(String)
  17. #----------------------------------------------------------------------
  18. def __init__(self, username, firstname, lastname, university):
  19. """"""
  20. self.username = username
  21. self.firstname = firstname
  22. self.lastname = lastname
  23. self.university = university
  24. # create tables
  25. Base.metadata.create_all(engine)

执行:

  1. python tabledef.py

ORM 创建了数据库文件tabledef.py。 它将 SQL 查询输出到屏幕,在本例中显示为:

  1. CREATE TABLE student (
  2. id INTEGER NOT NULL,
  3. username VARCHAR,
  4. firstname VARCHAR,
  5. lastname VARCHAR,
  6. university VARCHAR,
  7. PRIMARY KEY (id)
  8. )

因此,当我们定义一个类时,ORM 为我们创建了数据库表。 该表仍然为空。

将数据插入数据库

数据库表仍然为空。 我们可以使用 Python 对象将数据插入数据库。 因为我们使用 SqlAlchemy ORM,所以我们不必编写单个 SQL 查询。 现在,我们只需创建要馈送到 ORM 的 Python 对象。 将下面的代码另存为dummy.py

  1. import datetime
  2. from sqlalchemy import create_engine
  3. from sqlalchemy.orm import sessionmaker
  4. from tabledef import *
  5. engine = create_engine('sqlite:///student.db', echo=True)
  6. # create a Session
  7. Session = sessionmaker(bind=engine)
  8. session = Session()
  9. # Create objects
  10. user = Student("james","James","Boogie","MIT")
  11. session.add(user)
  12. user = Student("lara","Lara","Miami","UU")
  13. session.add(user)
  14. user = Student("eric","Eric","York","Stanford")
  15. session.add(user)
  16. # commit the record the database
  17. session.commit()

执行:

  1. python dummy.py

ORM 会将 Python 对象映射到关系数据库。 这意味着您无需与应用程序进行任何直接交互,只需与对象进行交互即可。 如果您使用 SQLiteman 或 SQLite 数据库应用程序打开数据库,则会发现该表已创建:

SqlAlchemy 和 ORM - 图3

数据表中的数据。

查询数据

我们可以使用以下代码查询表的所有项目。 请注意,Python 将每条记录视为Student类定义的唯一对象。 将代码另存为demo.py

  1. import datetime
  2. from sqlalchemy import create_engine
  3. from sqlalchemy.orm import sessionmaker
  4. from tabledef import *
  5. engine = create_engine('sqlite:///student.db', echo=True)
  6. # create a Session
  7. Session = sessionmaker(bind=engine)
  8. session = Session()
  9. # Create objects
  10. for student in session.query(Student).order_by(Student.id):
  11. print student.firstname, student.lastname

执行后,您将看到:

  1. James Boogie
  2. Lara Miami
  3. Eric York

要选择单个对象,请使用filter()方法。 下面的演示:

  1. import datetime
  2. from sqlalchemy import create_engine
  3. from sqlalchemy.orm import sessionmaker
  4. from tabledef import *
  5. engine = create_engine('sqlite:///student.db', echo=True)
  6. # create a Session
  7. Session = sessionmaker(bind=engine)
  8. session = Session()
  9. # Select objects
  10. for student in session.query(Student).filter(Student.firstname == 'Eric'):
  11. print student.firstname, student.lastname

输出:

  1. Eric York

最后,如果您不希望 ORM 输出,则任何 SQL 查询的输出都将create_engine语句更改为:

  1. engine = create_engine('sqlite:///student.db', echo=False)