美文网首页
Python ORM实现无外键的一对多/多对多关系

Python ORM实现无外键的一对多/多对多关系

作者: Exqlnet | 来源:发表于2018-08-02 08:16 被阅读0次

    前置工作

    安装如下工具
    Python 3.5.2
    Sqlalchemy
    mysql-connector, pymysql, mysql-python其中一个

    源代码

    from sqlalchemy import Column, String, create_engine, Table, MetaData, Integer, ForeignKey
    from sqlalchemy.orm import sessionmaker, relationship, foreign, remote
    from sqlalchemy.ext.declarative import declarative_base
    
    engine = create_engine("mysql+mysqlconnector://root:123456@localhost:3306/test")
    Base = declarative_base()  # 生成orm基类
    
    
    topic_label = Table("topic_label", Base.metadata,
                        Column("topic_id", Integer, primary_key=True),
                        Column("label_id", Integer, primary_key=True)
                        )
    
    
    class Label(Base):
        __tablename__ = "label"
    
        id = Column(Integer, primary_key=True)
        name = Column(String(20))
    
    
    class Topic(Base):
        __tablename__ = "topic"
    
        id = Column(Integer, primary_key=True)
        name = Column(String(20))
        labels = relationship("Label", primaryjoin=id == topic_label.c.topic_id,
                              secondaryjoin=Label.id == topic_label.c.label_id,
                              secondary=topic_label,
                              backref="topics",
                              )
    
    
    
    
    
    Base.metadata.create_all(engine)
    session = sessionmaker(bind=engine)()
    
    topic1 = Topic(id=1, name="第一个话题")
    topic2 = Topic(id=2, name="第二个话题")
    topic3 = Topic(id=3, name="第三个话题")
    
    label1 = Label(id=1, name="第一个标签")
    label2 = Label(id=2, name="第二个标签")
    label3 = Label(id=3, name="第三个标签")
    
    # Label.topics 和Topic.labels 可以看做是一个列表,往里面加入对象时,可能会同时影响3张表
    
    # 将topic2添加入label.topics中
    label2.topics.append(topic2)
    session.add(label2)
    session.commit()
    
    # 将label3添加入topic3.labels中
    # 过程: 创建了一个topic3,并且把label3贴给topic3,于是表topic、label和中间表topic_label都创建了一条数据
    topic3.labels.append(topic3)
    session.add(topic3)
    session.commit()
    
    

    sqlalchemy库介绍

    sqlalchemy.orm 储存了定义一些通过ORM访问数据库的相关内容
    sqlalchemy.* 定义了许多构建数据库的相关内容
    sqlalchemy.ext.declarative 主要用到declarative_base,用于创建数据库Model的基类

    相关文章

      网友评论

          本文标题:Python ORM实现无外键的一对多/多对多关系

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