Sqlchemy第三章了解一下

### 笔记

1. 多对多:

* 创建一个中间表,使用`Table`类,示例代码如下:

```python

teacher_classes = Table('teacher_classes',Base.metadata,

Column('teacher_id',Integer,ForeignKey('teacher.id'),nullable=False,primary_key=True),

Column('classes_id',Integer,ForeignKey('classes.id'),nullable=False,primary_key=True),

)

```

使用`ForeignKey`来指定外键的表的字段。并且给两个字段共同指定`primary_key`来让两个字段共同充当主键,这样可以保证数据的唯一性。

* 创建两个多对多的关系表。

* 给两个多对多的关系表添加访问对方的属性,注意,都使用复数形式,因为是多对多,所以访问对方都是数组的形式。并且给`relationship`指定一个`secondary`参数,这个参数的值就是哪个中间表。这样,就可以达到多对多的关系了。

### alembic:

1. `alembic`是`sqlalchemy`的作者也即`flask`的作者开发的。用来做`OMR`模型与数据库的迁移与映射。`alembic`使用方式跟`git`有点了类似,表现在两个方面,第一个,`alembic`的所有命令都是以`alembic`开头;第二,`alembic`的迁移文件也是通过版本进行控制的。

2. 安装:`pip install alembic`。

3. 按照之前的写法,定义好你需要的`ORM`模型。

4. 初始化`alembic`仓库:在终端中,`cd`到你的项目目录中,然后执行命令`alembic init alembic`,创建一个名叫`alembic`的仓库。

5. 修改配置文件:

* 在`alembic.ini`中设置数据库的连接,`sqlalchemy.url = driver://user:pass@localhost/dbname`,比如以`mysql`数据库为例,则配置后的代码为:

```python

sqlalchemy.url = mysql+mysqldb://root:root@localhost/alembic_demo?charset=utf8

```

* 为了使用模型类更新数据库,需要在`env.py`文件中设置`target_metadata`,默认为`target_metadata=None`。使用`sys`模块把当前项目的路径导入到`path`中:

```

import os

import sys

sys.path.append(os.path.dirname(os.path.abspath(__file__)) + "/../")

from models import Base

... #省略代码

target_metadata = Base.metadata # 设置创建模型的元类

... #省略代码

```

6. 自动生成迁移文件:使用`alembic revision --autogenerate -m "message"`将当前模型中的状态生成迁移文件。

7. 更新数据库:使用`alembic upgrade head`将刚刚生成的迁移文件,真正映射到数据库中。同理,如果要降级,那么使用`alembic downgrade head`。

8. 修改`ORM`模型的代码后,重复6~7的步骤。

9. 命令和参数解释:

* init:创建一个`alembic`仓库。

* revision:创建一个新的版本文件。

* --autogenerate:自动将当前模型的修改,生成迁移脚本。

* -m:本次迁移做了哪些修改,用户可以指定这个参数,方便回顾。

* upgrade:将指定版本的迁移文件映射到数据库中,会执行版本文件中的`upgrade`函数。

* downgrade:会执行指定版本的迁移文件中的`downgrade`函数。

* head:代表当前的迁移脚本的版本号。

* heads:展示当前可用的`heads`脚本文件。

* history:列出所有的迁移版本及其信息。

* current:展示当前数据库中的版本号。

另外,在你第一次执行`init`的时候,就会在数据库中创建一个名叫`alembic_version`表,这个表只会有一条数据,记录当前数据库映射的是哪个版本的迁移文件。


分享到:


相關文章: