最近在用flask框架做一個python web項目,其中要連接數據庫,所以總結如下:
如何用pycharm快速創建一個flask項目我就不詳細說了,可以先創建虛擬環境,不過大部分的事pycharm都幫你做好了.flask作爲一個輕量型的web框架還是挺靈活的,不管小型還是大型項目,都可以用這個框架來構建.
首先在命令行用pip安裝或者在pycharm裏面安裝數據庫連接依賴包flask-sqlalchemy,python3中已經不再支持MySQLdb模塊,所以要安裝pymysql(pip安裝或者在pycharm裏面安裝),如果在python3安裝mysql-python會出現一個錯誤,搜一下改一下一個文件的名字應該就能解決,不建議安裝mysql-python.安裝flask-sqlalchemy和pymysql就夠了
然後見代碼:
models.py
# coding=utf-8
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
import pymysql
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:password@localhost:3306/dbname?charset=utf8'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
db = SQLAlchemy(app) # 實例化
# 數據模型設計
# 會員數據模型
class User(db.Model):
__tablename__ = "user"
id = db.Column(db.Integer, primary_key=True) # 編號
name = db.Column(db.String(100), unique=True) # 暱稱
pwd = db.Column(db.String(100)) # 密碼
email = db.Column(db.String(30), unique=True) # 郵箱
phone = db.Column(db.String(11), unique=True) # 手機號碼
info = db.Column(db.Text) # 個人簡介
face = db.Column(db.String(255), unique=True) # 頭像
addtime = db.Column(db.DateTime, index=True, default=datetime.utcnow) # 註冊時間
uuid = db.Column(db.String(255), unique=True) # 唯一標誌
userlogs = db.relationship('Userlog', backref='user') # 會員日誌外鍵關聯
comments = db.relationship('Comment', backref='user') # 電影評論外鍵關聯
moviecols = db.relationship('Moviecol', backref='user') # 電影收藏外鍵關聯
def __repr__(self):
return "<User %r>" % self.name
# 會員登錄日誌
class Userlog(db.Model):
__tablename__ = "userlog"
id = db.Column(db.Integer, primary_key=True) # 編號
user_id = db.Column(db.Integer, db.ForeignKey('user.id')) # 所屬會員
ip = db.Column(db.String(100)) # 最近登錄ip
addtime = db.Column(db.DateTime, index=True, default=datetime.utcnow) # 最近登錄時間
def __repr__(self):
return "<Userlog %r>" % self.id
# 標籤
class Tag(db.Model):
__tablename__ = "tag"
id = db.Column(db.Integer, primary_key=True) # 編號
name = db.Column(db.String(100), unique=True) # 標題
addtime = db.Column(db.DateTime, index=True, default=datetime.utcnow) # 添加時間
movies = db.relationship("Movie", backref='tag') # 電影外鍵關聯
def __repr__(self):
return "<Tag %r>" % self.name
# 電影
class Movie(db.Model):
__tablename__ = "movie"
id = db.Column(db.Integer, primary_key=True) # 編號
title = db.Column(db.String(255), unique=True) # 標題
url = db.Column(db.String(255), unique=True) # 地址
info = db.Column(db.Text) # 簡介
logo = db.Column(db.String(255), unique=True) # 封面
star = db.Column(db.SmallInteger) # 星級
playnum = db.Column(db.BigInteger) # 播放量
commentnum = db.Column(db.BigInteger) # 評論量
tag_id = db.Column(db.Integer, db.ForeignKey('tag.id')) # 所屬標籤
area = db.Column(db.String(255)) # 上映地區
release_time = db.Column(db.Date) # 上映時間
length = db.Column(db.String(100)) # 時長
addtime = db.Column(db.DateTime, index=True, default=datetime.utcnow) # 添加時間
comments = db.relationship("Comment", backref='movie') # 評論外鍵關聯
moviecols = db.relationship('Moviecol', backref='movie') # 電影收藏外鍵關聯
def __repr__(self):
return "<Movie %r>" % self.title
# 電影預告
class Preview(db.Model):
__tablename__ = "preview"
id = db.Column(db.Integer, primary_key=True) # 編號
title = db.Column(db.String(255), unique=True) # 標題
logo = db.Column(db.String(255), unique=True) # 封面
addtime = db.Column(db.DateTime, index=True, default=datetime.utcnow) # 添加時間
def __repr__(self):
return "<Preview %r>" % self.title
# 評論
class Comment(db.Model):
__tablename__ = "comment"
id = db.Column(db.Integer, primary_key=True) # 編號
content = db.Column(db.Text) # 內容
movie_id = db.Column(db.Integer, db.ForeignKey('movie.id')) # 所屬電影
user_id = db.Column(db.Integer, db.ForeignKey('user.id')) # 所屬用戶
addtime = db.Column(db.DateTime, index=True, default=datetime.utcnow) # 添加時間
def __repr__(self):
return "<Comment %r>" % self.id
# 收藏
class Moviecol(db.Model):
__tablename__ = "moviecol"
id = db.Column(db.Integer, primary_key=True) # 編號
movie_id = db.Column(db.Integer, db.ForeignKey('movie.id')) # 所屬電影
user_id = db.Column(db.Integer, db.ForeignKey('user.id')) # 所屬用戶
addtime = db.Column(db.DateTime, index=True, default=datetime.utcnow) # 添加時間
def __repr__(self):
return "<Moviecol %r>" % self.id
# 權限
class Auth(db.Model):
__tablename__ = "auth"
id = db.Column(db.Integer, primary_key=True) # 編號
name = db.Column(db.String(100), unique=True) # 名稱
url = db.Column(db.String(255), unique=True) # 地址
addtime = db.Column(db.DateTime, index=True, default=datetime.utcnow) # 添加時間
def __repr__(self):
return "<Auth %r>" % self.name
# 角色
class Role(db.Model):
__tablename__ = "role"
id = db.Column(db.Integer, primary_key=True) # 編號
name = db.Column(db.String(100), unique=True) # 名稱
auths = db.Column(db.String(1000), unique=True) # 權限列表
addtime = db.Column(db.DateTime, index=True, default=datetime.utcnow) # 添加時間
def __repr__(self):
return "<Role %r>" % self.name
# 管理員
class Admin(db.Model):
__tablename__ = "admin"
id = db.Column(db.Integer, primary_key=True) # 編號
name = db.Column(db.String(100), unique=True) # 管理員賬號
pwd = db.Column(db.String(100)) # 管理員密碼
is_super = db.Column(db.SmallInteger) # 是否是超級管理員,0爲超級管理員,1不是
role_id = db.Column(db.Integer, db.ForeignKey('role.id')) # 所屬角色
addtime = db.Column(db.DateTime, index=True, default=datetime.utcnow) # 添加時間
adminlogs = db.relationship("Adminlog", backref='admin') # 管理員登錄日誌外鍵關聯
oplogs = db.relationship("Oplog", backref='admin') # 管理員操作日誌外鍵關聯
def __repr__(self):
return "<Admin %r>" % self.name
# 管理員登錄日誌
class Adminlog(db.Model):
__tablename__ = "adminlog"
id = db.Column(db.Integer, primary_key=True) # 編號
admin = db.Column(db.Integer, db.ForeignKey('admin.id')) # 所屬管理員
ip = db.Column(db.String(100)) # 最近登錄ip
addtime = db.Column(db.DateTime, index=True, default=datetime.utcnow) # 最近登錄時間
def __repr__(self):
return "<Adminlog %r>" % self.id
# 後臺操作日誌
class Oplog(db.Model):
__tablename__ = "oplog"
id = db.Column(db.Integer, primary_key=True) # 編號
admin = db.Column(db.Integer, db.ForeignKey('admin.id')) # 所屬管理員
ip = db.Column(db.String(100)) # 最近登錄ip
reason = db.Column(db.String(600)) # 操作原因
addtime = db.Column(db.DateTime, index=True, default=datetime.utcnow) # 最近登錄時間
def __repr__(self):
return "<Oplog %r>" % self.id
db.create_all()
除了語法啥的,那些URI還是和C,JAVA一樣,學的時候注意類推
運行完這個py文件以後,可以看到數據庫(注意要先手動創建,SQLAlchemy不會自動幫忙建的)裏面已經創建好表了
感覺和以前做javaweb項目一樣,當時用的springboot框架,這種ORM框架可以根據代碼自動映射數據庫,然後完成數據庫表的創建工作,原理都是一樣的.
不知道爲什麼只有去掉所有外鍵和關聯關係纔可以將數據插入數據庫:
from werkzeug.security import generate_password_hash
admin = Admin(
name="admin",
pwd=generate_password_hash("admin"),
is_super=0,
role_id=1
)
db.session.add(admin)
db.session.commit()