46.md 5.0 KB
Newer Older
W
wizardforcel 已提交
1
# SqlAlchemy 和 ORM
W
init  
wizardforcel 已提交
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189

> 原文: [https://pythonspot.com/orm-with-sqlalchemy](https://pythonspot.com/orm-with-sqlalchemy)

对象关系映射器将关系数据库系统映射到对象。 如果您不熟悉面向对象的编程,请先阅读本教程的[。 ORM 与使用哪个关系数据库系统无关。 在 Python 中,您可以与对象对话,ORM 会将其映射到数据库。 在本文中,您将学习如何使用 SqlAlchemy ORM。](https://pythonspot.com/objects-and-classes)

下图显示了 ORM 的功能:

![ORM Object Relational Mapping](img/9146e41d31ff53b16fd2fbb13d3f823e.jpg)

ORM Object Relational Mapping. We communicate with the database using the ORM and only use Python objects and classes.

## 创建一个类来填充 ORM

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

![class](img/56afbfa748895a916cb9a83cb407e791.jpg)

Class definition

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

这是 tabledef.py 的内容:

```py
from sqlalchemy import *
from sqlalchemy import create_engine, ForeignKey
from sqlalchemy import Column, Date, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, backref

engine = 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 = username
        self.firstname = firstname
        self.lastname = lastname
        self.university = university

# create tables
Base.metadata.create_all(engine)

```

执行:

```py
python tabledef.py

```

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

```py
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

```py
import datetime
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from tabledef import *

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

# create a Session
Session = sessionmaker(bind=engine)
session = Session()

# Create objects  
user = 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 database
session.commit()

```

执行:

```py
python dummy.py

```

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

![Data in database table.](img/deb55c16c07fa22d5f0e10f36f49e448.jpg)

Data in database table.

## 查询数据

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

```py
import datetime
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from tabledef import *

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

# create a Session
Session = sessionmaker(bind=engine)
session = Session()

# Create objects  
for student in session.query(Student).order_by(Student.id):
    print student.firstname, student.lastname

```

执行后,您将看到:

```py
James Boogie
Lara Miami
Eric York

```

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

```py
import datetime
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from tabledef import *

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

# create a Session
Session = sessionmaker(bind=engine)
session = Session()

# Select objects  
for student in session.query(Student).filter(Student.firstname == 'Eric'):
    print student.firstname, student.lastname

```

输出:

```py
Eric York

```

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

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

```