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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM