### ORM关系以及一对多: mysql级别的外键,还不够ORM,必须拿到一个表的外键,然后通过这个外键再去另外一张表中查找,这样太麻烦了。SQLAlchemy提供了一个`relationship`,这个类可以定义属性,以后在访问相关联的表的时候就直接可以通过属性访问的方式就可以访问得到了。示例代码: ```python class User(Base): __tablename__ = 'user' id = Column(Integer,primary_key=True,autoincrement=True) username = Column(String(50),nullable=False) # articles = relationship("Article") def __repr__(self): return "" % self.username class Article(Base): __tablename__ = 'article' id = Column(Integer,primary_key=True,autoincrement=True) title = Column(String(50),nullable=False) content = Column(Text,nullable=False) uid = Column(Integer,ForeignKey("user.id")) author = relationship("User",backref="articles") ``` 另外,可以通过`backref`来指定反向访问的属性名称。articles是有多个。他们之间的关系是一个一对多的关系。 实现代码: ```python from sqlalchemy import create_engine,Column,Integer,Float,Boolean,DECIMAL,Enum,Date,DateTime,Time,String,Text,func,and_,or_,ForeignKey from sqlalchemy.dialects.mysql import LONGTEXT from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker,relationship # 在Python3中才有这个enum模块,在python2中没有 import enum from datetime import datetime import random HOSTNAME = '127.0.0.1' PORT = '3306' DATABASE = 'pysql' 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)() # 父表 / 从表 # user/article class User(Base): __tablename__='user' id=Column(Integer,primary_key=True,autoincrement=True) username=Column(String(50),nullable=False) articles=relationship('Article') def __repr__(self): return "" % self.username class Article(Base): __tablename__='article' id=Column(Integer,primary_key=True,autoincrement=True) title=Column(String(50),nullable=False) content=Column(Text,nullable=False) uid=Column(Integer,ForeignKey("user.id",ondelete="SET NULL")) author=relationship(User) # author=relationship('User',backref='articles') def __repr__(self): return "" % (self.title,self.content) user=session.query(User).first() print(user.articles) ##通过user拿到article里面内容 article=session.query(Article).first() print(article.author) ##通过article拿到user里面内容 ``` Last modification:May 22nd, 2020 at 11:08 am © 允许规范转载 Support 如果觉得我的文章对你有用,请随意赞赏 ×Close Appreciate the author Sweeping payments Pay by AliPay Pay by WeChat
" % (self.title,self.content) user=session.query(User).first() print(user.articles) ##通过user拿到article里面内容 article=session.query(Article).first() print(article.author) ##通过article拿到user里面内容 ```
" % (self.title,self.content) user=session.query(User).first() print(user.articles) ##通过user拿到article里面内容 article=session.query(Article).first() print(article.author) ##通过article拿到user里面内容 ```