zoukankan      html  css  js  c++  java
  • flask-sqlalchemy的多对多使用

    '''
    多对多:

    比如:比如我的flask数据库连接配置这篇文章、他有python标签、又有web后端标签。 python标签、web后端、等很多文章都有
    '''


    #encoding: utf-8

    from sqlalchemy import create_engine,Column,Integer,Float,Boolean,DECIMAL,Enum,Date,DateTime,Time,String,Text,func,and_,or_,ForeignKey,Table
    from sqlalchemy.dialects.mysql import LONGTEXT
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import sessionmaker,relationship,backref
    # 在Python3中才有这个enum模块,在python2中没有
    import enum
    from datetime import datetime
    import random

    HOSTNAME = '127.0.0.1'
    PORT = '3306'
    DATABASE = 'first_sqlalchemy'
    USERNAME = 'root'
    PASSWORD = '123456'

    # dialect+driver://username:password@host:port/database
    DB_URI = "mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset=utf8mb4".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE)

    engine = create_engine(DB_URI)

    Base = declarative_base(engine)

    session = sessionmaker(engine)()


    # 多对多使用
    article_tag = Table(
    #中间表名称
    "article_tag",
    #继承 Basemetadata
    Base.metadata,
    #定义两个外键,是两个多对多文章的主键
    Column("article_id",Integer,ForeignKey("article.id"),primary_key=True),
    Column("tag_id",Integer,ForeignKey("tag.id"),primary_key=True)
    )


    class Article(Base):
    __tablename__ = 'article'
    id = Column(Integer,primary_key=True,autoincrement=True)
    title = Column(String(50),nullable=False)

    # tags = relationship("Tag",backref="articles",secondary=article_tag)

    def __repr__(self):
    return "<Article(title:%s)>" % self.title


    class Tag(Base):
    __tablename__ = 'tag'
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(50), nullable=False)

    articles = relationship("Article",backref="tags",secondary=article_tag)

    def __repr__(self):
    return "<Tag(name:%s)>" % self.name

    # 1. 先把两个需要做多对多的模型定义出来
    # 2. 使用Table定义一个中间表,中间表一般就是包含两个模型的外键字段就可以了,并且让他们两个来作为一个“复合主键”。
    # 3. 在两个需要做多对多的模型中随便选择一个模型,定义一个relationship属性,来绑定三者之间的关系,在使用relationship的时候,需要传入一个secondary=中间表。

    # Base.metadata.drop_all()
    # Base.metadata.create_all()
    #
    # article1 = Article(title = "哇咔咔1")
    # article2 = Article(title = "哇咔咔2")
    #
    # tag1 = Tag(name = "web后端")
    # tag2 = Tag(name = "python")
    #
    # article1.tags.append(tag1)
    # article1.tags.append(tag2)
    #
    #
    # article2.tags.append(tag1)
    # article2.tags.append(tag2)
    #
    # session.add(article1)
    # session.add(article2)
    #
    # session.commit()

    # 多对多直接用这样的方式 ,就能找到某个 文章所对应的标签,这是在是太爽了
    article = session.query(Article).first()
    print(article.tags)
  • 相关阅读:
    建立十字链表
    KMP算法
    魔术师发牌问题(循环链表)
    约瑟夫问题(循环链表)
    中缀表达式 转 (逆)波兰表达式
    中缀表达式求值
    迷宫问题(回溯法)
    范数
    AUC
    概率论
  • 原文地址:https://www.cnblogs.com/yuanjia8888/p/13335960.html
Copyright © 2011-2022 走看看