1. 程式人生 > 實用技巧 >1.2資料庫遷移

1.2資料庫遷移

1、首先我們先把模型類的程式碼放上來

  1 from datetime import datetime
  2 from werkzeug.security import generate_password_hash, check_password_hash
  3 
  4 from info import constants
  5 from . import db
  6 
  7 
  8 class BaseModel(object):
  9     """模型基類,為每個模型補充建立時間與更新時間"""
 10     create_time = db.Column(db.DateTime, default=datetime.now)  #
記錄的建立時間 11 update_time = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now) # 記錄的更新時間 12 13 14 # 使用者收藏表,建立使用者與其收藏新聞多對多的關係 15 tb_user_collection = db.Table( 16 "info_user_collection", 17 db.Column("user_id", db.Integer, db.ForeignKey("info_user.id"), primary_key=True), #
新聞編號 18 db.Column("news_id", db.Integer, db.ForeignKey("info_news.id"), primary_key=True), # 分類編號 19 db.Column("create_time", db.DateTime, default=datetime.now) # 收藏建立時間 20 ) 21 22 tb_user_follows = db.Table( 23 "info_user_fans", 24 db.Column('follower_id', db.Integer, db.ForeignKey('
info_user.id'), primary_key=True), # 粉絲id 25 db.Column('followed_id', db.Integer, db.ForeignKey('info_user.id'), primary_key=True) # 被關注人的id 26 ) 27 28 29 class User(BaseModel, db.Model): 30 """使用者""" 31 __tablename__ = "info_user" 32 33 id = db.Column(db.Integer, primary_key=True) # 使用者編號 34 nick_name = db.Column(db.String(32), unique=True, nullable=False) # 使用者暱稱 35 password_hash = db.Column(db.String(128), nullable=False) # 加密的密碼 36 mobile = db.Column(db.String(11), unique=True, nullable=False) # 手機號 37 avatar_url = db.Column(db.String(256)) # 使用者頭像路徑 38 last_login = db.Column(db.DateTime, default=datetime.now) # 最後一次登入時間 39 is_admin = db.Column(db.Boolean, default=False) 40 signature = db.Column(db.String(512)) # 使用者簽名 41 gender = db.Column( # 訂單的狀態 42 db.Enum( 43 "MAN", # 44 "WOMAN" # 45 ), 46 default="MAN") 47 @property 48 def password(self): 49 return "you can't read" 50 51 @password.setter 52 def password(self, value): 53 self.password_hash = generate_password_hash(value) 54 55 def check_password(self,value): 56 return check_password_hash(self.password_hash,value) 57 def check_pass(self, value): 58 pass 59 # 當前使用者收藏的所有新聞 60 collection_news = db.relationship("News", secondary=tb_user_collection, lazy="dynamic") # 使用者收藏的新聞 61 # 使用者所有的粉絲,添加了反向引用followed,代表使用者都關注了哪些人 62 followers = db.relationship('User', 63 secondary=tb_user_follows, 64 primaryjoin=id == tb_user_follows.c.followed_id, 65 secondaryjoin=id == tb_user_follows.c.follower_id, 66 backref=db.backref('followed', lazy='dynamic'), 67 lazy='dynamic') 68 69 # 當前使用者所釋出的新聞 70 news_list = db.relationship('News', backref='user', lazy='dynamic') 71 72 def to_dict(self): 73 resp_dict = { 74 "id": self.id, 75 "nick_name": self.nick_name, 76 "avatar_url": constants.QINIU_DOMIN_PREFIX + self.avatar_url if self.avatar_url else "", 77 "mobile": self.mobile, 78 "gender": self.gender if self.gender else "MAN", 79 "signature": self.signature if self.signature else "", 80 "followers_count": self.followers.count(), 81 "news_count": self.news_list.count() 82 } 83 return resp_dict 84 85 def to_admin_dict(self): 86 resp_dict = { 87 "id": self.id, 88 "nick_name": self.nick_name, 89 "mobile": self.mobile, 90 "register": self.create_time.strftime("%Y-%m-%d %H:%M:%S"), 91 "last_login": self.last_login.strftime("%Y-%m-%d %H:%M:%S"), 92 } 93 return resp_dict 94 95 96 class News(BaseModel, db.Model): 97 """新聞""" 98 __tablename__ = "info_news" 99 100 id = db.Column(db.Integer, primary_key=True) # 新聞編號 101 title = db.Column(db.String(256), nullable=False) # 新聞標題 102 source = db.Column(db.String(64), nullable=False) # 新聞來源 103 digest = db.Column(db.String(512), nullable=False) # 新聞摘要 104 content = db.Column(db.Text, nullable=False) # 新聞內容 105 clicks = db.Column(db.Integer, default=0) # 瀏覽量 106 index_image_url = db.Column(db.String(256)) # 新聞列表圖片路徑 107 category_id = db.Column(db.Integer, db.ForeignKey("info_category.id")) 108 user_id = db.Column(db.Integer, db.ForeignKey("info_user.id")) # 當前新聞的作者id 109 status = db.Column(db.Integer, default=0) # 當前新聞狀態 如果為0代表稽核通過,1代表稽核中,-1代表稽核不通過 110 reason = db.Column(db.String(256)) # 未通過原因,status = -1 的時候使用 111 # 當前新聞的所有評論 112 comments = db.relationship("Comment", lazy="dynamic") 113 114 def to_review_dict(self): 115 resp_dict = { 116 "id": self.id, 117 "title": self.title, 118 "create_time": self.create_time.strftime("%Y-%m-%d %H:%M:%S"), 119 "status": self.status, 120 "reason": self.reason if self.reason else "" 121 } 122 return resp_dict 123 124 def to_basic_dict(self): 125 resp_dict = { 126 "id": self.id, 127 "title": self.title, 128 "source": self.source, 129 "digest": self.digest, 130 "create_time": self.create_time.strftime("%Y-%m-%d %H:%M:%S"), 131 "index_image_url": self.index_image_url, 132 "clicks": self.clicks, 133 } 134 return resp_dict 135 136 def to_dict(self): 137 resp_dict = { 138 "id": self.id, 139 "title": self.title, 140 "source": self.source, 141 "digest": self.digest, 142 "create_time": self.create_time.strftime("%Y-%m-%d %H:%M:%S"), 143 "content": self.content, 144 "comments_count": self.comments.count(), 145 "clicks": self.clicks, 146 "category": self.category.to_dict(), 147 "index_image_url": self.index_image_url, 148 "author": self.user.to_dict() if self.user else None 149 } 150 return resp_dict 151 152 153 class Comment(BaseModel, db.Model): 154 """評論""" 155 __tablename__ = "info_comment" 156 157 id = db.Column(db.Integer, primary_key=True) # 評論編號 158 user_id = db.Column(db.Integer, db.ForeignKey("info_user.id"), nullable=False) # 使用者id 159 news_id = db.Column(db.Integer, db.ForeignKey("info_news.id"), nullable=False) # 新聞id 160 content = db.Column(db.Text, nullable=False) # 評論內容 161 parent_id = db.Column(db.Integer, db.ForeignKey("info_comment.id")) # 父評論id 162 parent = db.relationship("Comment", remote_side=[id]) # 自關聯 163 like_count = db.Column(db.Integer, default=0) # 點贊條數 164 165 def to_dict(self): 166 resp_dict = { 167 "id": self.id, 168 "create_time": self.create_time.strftime("%Y-%m-%d %H:%M:%S"), 169 "content": self.content, 170 "parent": self.parent.to_dict() if self.parent else None, 171 "user": User.query.get(self.user_id).to_dict(), 172 "news_id": self.news_id, 173 "like_count": self.like_count 174 } 175 return resp_dict 176 177 178 class CommentLike(BaseModel, db.Model): 179 """評論點贊""" 180 __tablename__ = "info_comment_like" 181 comment_id = db.Column("comment_id", db.Integer, db.ForeignKey("info_comment.id"), primary_key=True) # 評論編號 182 user_id = db.Column("user_id", db.Integer, db.ForeignKey("info_user.id"), primary_key=True) # 使用者編號 183 184 185 class Category(BaseModel, db.Model): 186 """新聞分類""" 187 __tablename__ = "info_category" 188 189 id = db.Column(db.Integer, primary_key=True) # 分類編號 190 name = db.Column(db.String(64), nullable=False) # 分類名 191 news_list = db.relationship('News', backref='category', lazy='dynamic') 192 193 def to_dict(self): 194 resp_dict = { 195 "id": self.id, 196 "name": self.name 197 } 198 return resp_dict

2、有了這些程式碼後我們在pychram中開啟命令框

然後輸入python manage.py mysql init這行程式碼(注意:輸入前記得看好檔案的路徑),為什麼是mysql init,因為我們在manage中設定的關於

資料庫操作程式碼就是這個,(根據自己的修改輸入程式碼

這個程式碼操作成功會出現一堆操作的提示,最後出現done就說明成功了,然後會生成一下的檔案

最後在命令框中輸入python manage.py mysql migrations 來完成最後的遷移步驟,連沒連線成功可以通過

pychrm中的Database 檢視是否和資料庫連線成功,成功了就會顯示出你資料庫中的資料