#encoding: utf-8 from sqlalchemy import create_engine,Column,Integer,String,Float,func,and_,or_,Text, ForeignKey,DateTime from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker,relationship,backref from random import randint from datetime import datetime 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=utf8".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE) engine = create_engine(DB_URI) Base = declarative_base(engine) # Session = sessionmaker(engine) # session = Session() session = sessionmaker(engine)() #Session(**local_kw) class User(Base): __tablename__ = 'user' id = Column(Integer,primary_key=True,autoincrement=True) username = Column(String(32),nullable=False) # articles = relationship("Article") #获取用户发布所有文章 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='RESTRICT'),nullable=False) #没有加载懒加载技术的relationship # author = relationship('User',backref='articles') #注意是user表对article表的懒加载,写在多关系一边 author = relationship('User',backref=backref('article',lazy= 'dynamic')) def __repr__(self): return '<article:%s>'%self.title s # Base.metadata.drop_all() # # Base.metadata.create_all() # # user = User(username='zhiliao') # # for x in range(100): # article = Article(title='title%s'%x,content='content%s'%x) # article.author = user # session.add(article) # session.commit() #获取该用户的所有文章 # user = session.query(User).first() # # print(user.articles) #如果获取该用户今天发表的文章 # articles = user.articles # article_today = [article for article in articles if article.create_time.day=='today'] #如果想上面那样做的话,很耗费性能,等于我要全部查一遍 # user = session.query(User).first() # print(type(user.articles)) #<class 'sqlalchemy.orm.collections.InstrumentedList'>,这是没有加载lazy user = session.query(User).first() print(type(user.articles))#<class 'sqlalchemy.orm.dynamic.AppenderQuery'>加了lazy就变成了AppenderQuery对象 #因为AppenderQuery对象,就可以这样写,比如说查询该用户31天发表的文章,大大节省了性能 print(user.articles.filter(Article.create_time.day == 31)) #还可以追加数据进去 article = Article(title= 'title100') user.articles.append(article) session.commit()