class ItemModel(db.Model): __tablename__ = "items" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(255), nullable=False, unique=True) price = db.Column(db.Float(precision=2), nullable=False) store_id = db.Column(db.Integer, db.ForeignKey( "stores.id"), nullable=False) store = db.relationship("StoreModel") @classmethod def find_by_name(cls, name: str) -> "ItemModel": return cls.query.filter_by(name=name).first() @classmethod def find_all(cls) -> List["ItemModel"]: return cls.query.all() def save_to_db(self) -> None: db.session.add(self) db.session.commit() def delete_from_db(self) -> None: db.session.delete(self) db.session.commit()
class Weibo(db.Model): __tablename__ = 'weibo' id = db.Column(db.Integer, primary_key=True) uid = db.Column(db.Integer, nullable=False) content = db.Column(db.Text) created = db.Column(db.DateTime, default=datetime.datetime.now()) n_zan = db.Column(db.Integer, default=0)
class Follow(db.Model): '''关注表''' __tablename__ = 'follow' uid = db.Column(db.Integer, primary_key=True) # 关注者的 UID fid = db.Column(db.Integer, primary_key=True) # 被关注者的 UID @classmethod def is_followed(cls, uid, fid): '''检查是否关注过对方''' query_result = cls.query.filter_by(uid=uid, fid=fid).exists() return db.session.query(query_result).scalar()
class Like(db.Model): ''''点赞表''' __tablename__ = 'like' uid = db.Column(db.Integer, primary_key=True) wid = db.Column(db.Integer, primary_key=True) @classmethod def is_liked(cls, uid, wid): '''检查是否已存在赞''' base_query = Like.query.filter_by(uid=uid, wid=wid).exists() return db.session.query(base_query).scalar()
class Weibo(db.Model): #表的名字 __tablename__ = 'weibo' #表的结构 id = db.Column(db.Integer, primary_key=True) #主键 uid = db.Column(db.Integer, nullable=False) #不可空类型 content = db.Column(db.Text) #内容为文本类型 created = db.Column(db.DateTime, default=datetime.now) #发布时间 updated = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now) #更新时间为当前时间
class Profile(db.Model): __tablename__ = 'profile' id = db.Column(db.Integer, primary_key=True) location = db.Column(ChoiceType(genders)) min_distance = db.Column(db.Integer) max_distance = db.Column(db.Integer) min_dating_age = db.Column(db.Integer) max_dating_age = db.Column(db.Integer) dating_sex = db.Column(ChoiceType(locations)) vibration = db.Column(db.Boolean()) only_matche = db.Column(db.Boolean()) auto_play = db.Column(db.Boolean())
class TokenBlacklist(db.Model): __tablename__ = 'blacklist' id = db.Column(db.Integer, primary_key=True) jti = db.Column(db.String(120)) def add(self): db.session.add(self) db.session.commit() @classmethod def is_jti_blacklisted(cls, jti): query = cls.query.filter_by(jti=jti).first() return bool(query)
class UserModel(db.Model): __tablename__ = "users" id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(20), nullable=False, unique=True) email = db.Column(db.String(255), nullable=False, unique=True) password = db.Column(db.String(128), nullable=False) activation = db.relationship("ActivationModel", lazy="dynamic", cascade="all, delete-orphan") @property def most_recent_activation(self) -> "ActivationModel": return self.activation.order_by(db.desc( ActivationModel.expire_at)).first() @classmethod def find_by_username(cls, username: str) -> "UserModel": return cls.query.filter_by(username=username).first() @classmethod def find_by_email(cls, email: str) -> "UserModel": return cls.query.filter_by(email=email).first() @classmethod def find_by_id(cls, _id: int) -> "UserModel": return cls.query.filter_by(id=_id).first() def send_confirmation_email(self) -> Response: link = request.url_root[:-1] + url_for( "activation", activation_id=self.most_recent_activation.id) subject = "Registration activation" text = f"Please click the link to activate your registration: {link}" html = f'<html>Please click the link to activate your registration: <a href="{link}">Activation Link</a></html>' return Mailgun.send_email(self.email, subject, text, html) def save_to_db(self) -> None: db.session.add(self) db.session.commit() def delete_from_db(self) -> None: db.session.delete(self) db.session.commit() def verify_password(self, password: str) -> bool: return bc.check_password_hash(self.password, password)
class User(db.Model): __tablename__ = 'user' id = db.Column(db.Integer,primary_key=True) nickname = db.Column(db.String(20),unique=True,nullable=False,index=True) password = db.Column(db.String(128),nullable=True) gender = db.Column(db.String(10),default='unknow') bio = db.Column(db.String(200)) city = db.Column(db.String(16),default='上海') avatar = db.Column(db.String(128)) birthday = db.Column(db.Date,default='1997-01-11') created = db.Column(db.DATETIME)
class User(db.Model): __tablename__ = 'user' id = db.Column(db.Integer, primary_key=True, autoincrement=True) # 用户 ID nickname = db.Column(db.String(32), unique=True) # 昵称 password = db.Column(db.String(128)) # 用户的安全密码 gender = db.Column(db.String(16)) # 性别 city = db.Column(db.String(16)) # 城市 avatar = db.Column(db.String(128)) # 头像地址 birthday = db.Column(db.Date, default='2000-01-01') # 生日 bio = db.Column(db.Text()) # 个人简介
class User(db.Model): __tablename__ = 'user' id = db.Column(db.Integer, primary_key=True, autoincrement=True) nickname = db.Column(db.String(32), unique=True) password = db.Column(db.String(128)) gender = db.Column(db.String(16)) city = db.Column(db.String(16)) avatar = db.Column(db.String(128)) birthday = db.Column(db.Date, default='2000-01-01') bio = db.Column(db.Text())
class User(db.Model): '''用户表''' __tablename__ = 'user' id = db.Column(db.Integer, primary_key=True) #id nickname = db.Column(db.String(20), unique=True, nullable=False, index=True) #昵称 password = db.Column(db.String(128), nullable=True) #密码 gender = db.Column(db.String(10), default='unknow') #性别 bio = db.Column(db.String(200)) #经历 city = db.Column(db.String(16), default='上海') #所在城市 avatar = db.Column(db.String(128)) #头像 birthday = db.Column(db.Date, default='1990-01-01') #生日 created = db.Column(db.DateTime) #创建时间
class User(db.Model): '''用户表''' __tablename__ = 'user' #定义表名 id = db.Column(db.Integer, primary_key=True) #主关键字 nickname = db.Column(db.String(20), unique=True, nullable=False, index=True) #唯一的,不能为空,索引 password = db.Column(db.String(128), Tnullable=False) #不能为空 gender = db.Column(db.String(10), default='unknow') #默认值 bio = db.Column(db.String(200)) city = db.Column(db.String(16), default='上海') #默认是上海 avater = db.Column(db.String(128)) birthday = db.Column(db.Date, default='1990-01-01') #创建日期 created = db.Column(db.DateTime)
class Comment(db.Model): '''评论表''' __tablename__ = 'comment' id = db.Column(db.Integer, primary_key=True) uid = db.Column(db.Integer, nullable=False) # 评论的作者ID wid = db.Column(db.Integer, nullable=False) # 被评论的微博的ID cid = db.Column(db.Integer, nullable=False, default=0) # 回复的评论的ID rid = db.Column(db.Integer, nullable=False, default=0) # 回复的回复的ID content = db.Column(db.Text) created = db.Column(db.DateTime, default=datetime.now)
class User(db.Model): __tablename__ = 'user' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(30), unique=True, index=True) phone = db.Column(db.String(50)) avatar = db.Column(db.String(100)) gender = db.Column(ChoiceType(genders)) location = db.Column(ChoiceType(locations)) birthday = db.Column(db.Date,default='2000-01-01')
class StoreModel(db.Model): __tablename__ = "stores" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(255), nullable=False, unique=True) items = db.relationship("ItemModel", lazy="dynamic", viewonly=True) @classmethod def find_by_name(cls, name: str) -> "StoreModel": return cls.query.filter_by(name=name).first() @classmethod def find_all(cls) -> List["StoreModel"]: return cls.query.all() def save_to_db(self) -> None: db.session.add(self) db.session.commit() def delete_from_db(self) -> None: db.session.delete(self) db.session.commit()
class ActivationModel(db.Model): __tablename__ = "activations" id = db.Column(db.String(50), primary_key=True) expire_at = db.Column(db.Integer, nullable=False) activated = db.Column(db.Boolean, nullable=False) user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False) user = db.relationship("UserModel", viewonly=True) def __init__(self, user_id: int, **kwargs): super().__init__(**kwargs) self.user_id = user_id self.id = uuid4().hex self.expire_at = int(time()) + ACTIVATION_EXPIRATION_DELTA self.activated = False @classmethod def find_by_id(cls, _id: str) -> "ActivationModel": return cls.query.filter_by(id=_id).first() @property def expired(self) -> bool: return time() > self.expire_at def force_to_expire(self) -> None: if not self.expired: self.expire_at = int(time()) self.save_to_db() def save_to_db(self) -> None: db.session.add(self) db.session.commit() def delete_from_db(self) -> None: db.session.delete(self) db.session.commit()
class Weibo(db.Model): __tablename__ = 'weibo' id = db.Column(db.Integer, primary_key=True) uid = db.Column(db.Integer, nullable=False) content = db.Column(db.Text) created = db.Column(db.DateTime, default=datetime.now) # 发布时间 updated = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now) # 最后修改的时间 n_like = db.Column(db.Integer, default=0) # 当前微博的点赞数量
class Weibo(db.Model): __tablename__ = 'weibo' # 作者和微博的关系 一对多关系 不一定使用外键 只是约束关系 #外键的缺点:慢 效率低 对于大型数据 在查询的时候 A链接B 会关联性的扫描 #数据库中有自带索引的 id = db.Column(db.Integer, primary_key=True) uid = db.Column(db.Integer, nullable=False) #用户id # show databases; use weibo; show tables; show indexes in user; show indexes in user \G; # 加索引的情况 Btree(二三树(更具效率)B父节点保存数据 B+树 没有父节点数据 由子节点关联在一起) 二叉树 (父节点 两条线) content = db.Column(db.Text) #创建时间 created = db.Column(db.DateTime, default=datetime.now) # 发布时间 updated = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now) # 最后修改的时间 n_like = db.Column(db.Integer, default=0) # 当前微博的点赞数量
class Weibo(db.Model): '''微博表''' __tablename__ = 'weibo' id = db.Column(db.Integer, primary_key=True) # 微博ID uid = db.Column(db.Integer) # 对应的用户 ID content = db.Column(db.Text) # 微博内容 created = db.Column(db.DateTime) # 微博创建时间 updated = db.Column(db.DateTime) # 微博修改时间 n_like = db.Column(db.Integer, default=0) # 冗余字段: 当前微博的点赞数 @property def user(self): '''当前微博作者''' if not hasattr(self, '_user'): self._user = User.query.get(self.uid) return self._user
class Weibo(db.Model): '''微博表''' __tablename__ = 'weibo' id = db.Column(db.Integer, primary_key=True) uid = db.Column(db.Integer) content = db.Column(db.Text) created = db.Column(db.DateTime) updated = db.Column(db.DateTime) # 点赞数 n_like = db.Column(db.Integer, default=0) @property # 外键==》property!!!!!!! def user(self): '''当前微博作者''' if not hasattr(self, '_user'): self._user = User.query.get(self.uid) return self._user
class Comment(db.Model): __tablename__ = 'comment' id = db.Column(db.Integer, primary_key=True) uid = db.Column(db.Integer) # 用户 ID wid = db.Column(db.Integer) # 微博 ID cid = db.Column(db.Integer) # 评论 ID content = db.Column(db.Text) # 评论内容 created = db.Column(db.DateTime) # 评论时间 @property def user(self): '''当前评论的作者''' if not hasattr(self, '_user'): self._user = User.query.get(self.uid) return self._user @property def weibo(self): '''当前评论的微博''' if not hasattr(self, '_weibo'): self._weibo = Weibo.query.get(self.wid) return self._weibo @property def reply_comment(self): '''当前回复的评论''' if self.cid == 0: return None elif not hasattr(self, '_reply_comment'): self._reply_comment = Comment.query.get(self.cid) return self._reply_comment
class Like(db.Model): __tablename__ = 'like' uid = db.Column(db.Integer, primary_key=True) wid = db.Column(db.Integer, primary_key=True)
class UserModel(db.Model): __tablename__ = "users" id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(10), nullable=False) password = db.Column(db.String(100), nullable=False) email = db.Column(db.String(256), nullable=False, unique=True) country = db.Column(db.String(50), nullable=False) phone_number = db.Column(db.String(30), nullable=False) state = db.Column(db.String(50), nullable=False) city = db.Column(db.String(50), nullable=False) confirmed = db.relationship("UserConfirmationModel", lazy="dynamic", cascade="all, delete-orphan") async def init(self, username, password, email, country: str, phone_number, state, city, *args): self.username = username self.password = psw.generate_password_hash(password).decode('utf8') self.email = email self.country = await Country.get_country_name(Country, country) self.region = await Country.get_country_region(Country) self.phone_number = await Country.get_user_phonenumber( Country, phone_number) self.state = await Country.get_states(Country, state) self.city = await Country.get_city(Country, city) @property def recent_confirmation(self) -> "UserConfirmationModel": return self.confirmed.order_by( db.desc(UserConfirmationModel.token_expires_at)).first() @classmethod async def find_user_by_id(cls, id) -> "UserModel": return cls.query.filter(cls.id == id).first() @classmethod async def find_user_by_email(cls, email): return cls.query.filter(cls.email == email).first() @classmethod async def find_user_by_name(cls, name): return cls.query.filter(cls.username == name).first() async def save_to_db(self): db.session.add(self) db.session.commit() async def send_email(self): subject = "Registration Confirmation" link = request.url_root[:-1] + url_for( "user_confirm.user_confirm") + "/" + str( self.recent_confirmation.confirmation_id) text = f"Please click the link to confirm your registration:{link}" html = f"<html>Click the link to confirm your registration:<a href={link}>Confirmation Token</a></html>" return await Mailgun.send_email([self.email], subject, text, html), "Done Here" async def delete_from_db(self): db.session.delete(self) db.session.commit() def __repr__(self): return f"{self.id, self.username, self.email, self.password}"
class Zan(db.Model): __tablename__ = 'zan' uid = db.Column(db.Integer, primary_key=True) wid = db.Column(db.Integer, primary_key=True)
class Follow(db.Model): '''关注表''' __tablename__ = 'follow' uid = db.Column(db.Integer, primary_key=True) fid = db.Column(db.Integer, primary_key=True)