美文网首页
MySQL 数据库表的一对一、多对多关系

MySQL 数据库表的一对一、多对多关系

作者: Manchangdx | 来源:发表于2018-05-05 00:20 被阅读0次

创建一对一和多对多关系的数据库表,首先引入所需方法,
并创建连接数据库的 engine 、生成映射类的 Base 和处理数据增删改查的 session :

from sqlalchemy import (create_engine, Column, Integer, String, 
                        ForeignKey, Table)
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, backref, sessionmaker
engine = create_engine('mysql://root@localhost/test?charset=utf8')
Base = declarative_base(engine)
session = sessionmaker(engine)()

创建两个一对一的映射类,User 和 Course 。
注意,默认 Course 实例的 user 属性值为一个外键关联的 User 对象,
而 User 实例的 course 属性值为列表,列表里是一个外键关联的 Course 实例,
所以在 Course 映射类的 relationship 中,backref 里通常设置 uselist=False :

class User(Base):
    __tablename__ = 'user'
    id = Column(Integer, primary_key=True)
    name = Column(String(64), unique=True, nullable=False)
    def __repr__(self):
        return '<User: {}>'.format(self.name)
class Course(Base):
    __tablename__ = 'course'
    id = Column(Integer, ForeignKey('user.id'), primary_key=True)
    name = Column(String(64), unique=True, nullable=False)
    user = relationship('User', backref=backref('course', uselist=False))
    def __repr__(self):
        return '<Course: {}>'.format(self.name)

接下来创建 tag 标签表,与 course 表为多对多的关系。
首先创建中间表的映射类,用 Table 这个特殊类创建,此类的实例就是映射类。
该类在实例化时,接收 4 个参数:
1、数据表名字 2、Base.metadata
3 和 4、两个 Column(列名,数据类型,外键,主键)

Rela = Table('rela', Base.metadata,
    Column('tag_id', Integer, ForeignKey('tag.id'), primary_key=True),
    Column('course_id', Integer, ForeignKey('course.id'), primary_key=True)
)

创建 Tag 映射类:

class Tag(Base):
    __tablename__ = 'tag'
    id = Column(Integer, primary_key=True)
    name = Column(String(64), unique=True)
    course = relationship('Course', secondary=Rela, backref='tag')
    def __repr__(self):
        return '<Tag: {}>'.format(self.name)

使用 Base 的 create_all 方法生成 4 张数据库表:

Base.metadata.create_all()

接下来,生成几个实例并使用 session 传入数据库:

u = User(name='Kobe')
c = Course(name='MySQL 基础', user=u)
t = Tag(name='Python')
# 使用 append 方法将 Course 实例放到 Tag 实例的 course 属性值的列表里
# 这样,这俩实例就互相关联了
t.course.append(c)     
for i in (u, c, t):
    session.add(i)
session.commit()

以上代码在 python shell 里也是一样的,不过需要注意:
如果这些映射类不是全部创建完一并生成数据库表的话,
比如先生成了 user 表和 course 表,
然后就创建了实例并用 session 提交到数据库,
之后又创建了中间表和 tag 表,
这时,之前的 Course 类的实例的变量就不能用了,
因为 Course 类的外键关联发生了变化
此时,需要先执行 session.close() 复位 session,
然后重新处理数据即可。

相关文章

  • MySQL数据库中的理论知识:表关系 和 范式

    MySQL表关系:一对一, 一对多, 多对多 关系 将实体与实体的关系,反应到最终数据库表的设计上,将关系分为三...

  • 八:关联关系

    表的关系:MySQL相互关联的表之间存在一对一,一对多(多对一),多对多的关系 1.一对一的关系:表1中的一条数据...

  • python编写数据库表关系

    表关系(一对一,一对多,多对多) 查看数据库中已完成的表

  • Django笔记:数据库多表操作

    数据库的表与表之间有三种关系:一对一、一对多、多对多。那么如何通过模型建立这些关系呢 一对一:OneToOneFi...

  • 数据库表与表之间的关系

    1、数据库中表与表之间的关系 表与表之间一般存在三种关系,即一对一,一对多,多对多关系。 (1)一对一 (2)一对...

  • MYSQL回顾(表关系相关)

    数据库表有三种关系: 多对一 多对多 一对一 多对一 外键在“多”侧 比如有两个表,分别是书籍表和出版社表。书籍和...

  • 数据表设计原则及三范式

    数据表的几种的关系 一对一:学生和学生证 一对多:学生和班级 多对多:学生和课程 如何表示数据库表之间的关系 使用...

  • 数据库 表与表 的三种基本关系

    表和表之间,一般就是三种关系:一对一,一对多,多对多 1、一对一:数据库表中的数据结构,我们用人与车一 一对应的方...

  • 数据库一对一、一对多、多对多设计

    数据库一对一、一对多、多对多设计 数据库实体间有三种对应关系:一对一、一对多、多对多 一对一关系示例: 一个学生对...

  • 02MySQL的多表操作

    MySQL的多表操作 1 多表关系 MySQL多表之间的关系可以概括为:一对一、一对多/多对一关系,多对多 1.1...

网友评论

      本文标题:MySQL 数据库表的一对一、多对多关系

      本文链接:https://www.haomeiwen.com/subject/lttsrftx.html