|
|
from flask import Flask4 J4 Q' V Q7 K+ h0 r- M% J
app = Flask(__name__)
: Q+ A6 ^- u+ C1 j J) F) o7 t5 Q3 H. U: q. G* P
class Config(object):' \8 W1 G1 [8 M+ k
DEBUG = True# {" w' `# A, Z3 p' X: l
# 数据库连接配置4 W9 f3 r9 o) [ b0 U! N' p
# SQLALCHEMY_DATABASE_URI = "数据库类型://数据库账号:密码@数据库地址:端口/数据库名称?charset=utf8mb4"
) ^# e- }% T8 M" H$ r, s( b SQLALCHEMY_DATABASE_URI = "mysql://root:123@127.0.0.1:3306/students?charset=utf8mb4"# {% P4 Z: w/ Y& M* H$ g/ P
# 动态追踪修改设置,如未设置只会提示警告
1 F/ I9 W. \+ h! R+ I SQLALCHEMY_TRACK_MODIFICATIONS = True
2 t& ?; o; e! `5 C: l1 ^6 s # 查询时会显示原始SQL语句
& H, p, G4 N# X% |" V+ g SQLALCHEMY_ECHO = True
1 j% r5 d' |$ u( V' R- q2 K$ k
# W3 f( m: h8 _7 @ p t* \app.config.from_object(Config)
) L1 X* N! t; ? t. t- s6 P/ l* W% l: Z" K4 Y) s" z/ u
1 a1 C6 ~8 R) e4 k! V. Y5 D% t"""模型类定义"""" V$ \* q' W. P+ c
from flask_sqlalchemy import SQLAlchemy
& R$ m! Y1 p1 v9 K6 Ddb = SQLAlchemy(app=app)
, J" K$ o! P4 F8 ~# 等同于" U. M/ Q" w6 a0 G, d3 A) O6 k. X
# db = SQLAlchemy(); y$ E7 Y' P3 d5 H, i p4 @
# db.init_app(app)
/ Y. A+ V" l& q( Y
* f1 q1 \+ Q9 G" L6 pclass Student(db.Model):
( {6 u; e; X+ h; | """学生信息模型"""+ I- G: y6 p/ P- w+ e7 M
# 声明与当前模型绑定的数据表名称0 z: ?. ~1 ~+ m; z, C9 o( a" h* W7 @5 U
__tablename__ = "db_students"% I. S% L4 ^6 b! F, s
# 字段定义
2 n( g+ _8 C& U, [+ ?, Q """
& u; L5 B8 ^1 u! }3 p+ |8 I create table db_student(
5 i9 _) ?% G) T1 Y- [ id int primary key auto_increment comment="主键",
$ X: e* x B- e. e9 q* A! ` name varchar(15) comment="姓名",
2 ^. }& a ^: g2 d7 R )
/ o9 ^; s- O+ J; Y* z$ E; o9 Y j """4 E) g7 L2 {+ j; b; F/ U
id = db.Column(db.Integer, primary_key=True,comment="主键")( I6 K/ Y, c, `
name = db.Column(db.String(15), comment="姓名")) @7 P) W5 [) L; T9 i* a; m
age = db.Column(db.SmallInteger, comment="年龄")
' ~8 Z- N. |2 |7 W5 h9 l" W sex = db.Column(db.Boolean, default=True, comment="性别")+ c( H* `) x) O
email = db.Column(db.String(128), unique=True, comment="邮箱地址")
( G$ N' [( {. ?4 e# D+ ~' Z money = db.Column(db.Numeric(10,2), default=0.0, comment="钱包") l, z5 {( r& {8 J' e1 f
y2 `. ]+ j7 R2 ~* @- r+ N8 S def __repr__(self):
* q, z, F/ @* \ return f"{self.name}<Student>"" f$ ?- H7 J2 s( K' {9 K
9 H: q+ Q7 ?9 z
# 所有的模型必须直接或间接继承于db.Model' }( e/ e4 a/ t- C1 H- e, E
class Course(db.Model):
0 p7 w! `2 u% R0 L+ _. ?$ V6 F """课程数据模型"""
7 I7 s( v7 x% q( |% | __tablename__ = "db_course"
# C5 _/ X+ N) [9 k9 J) f id = db.Column(db.Integer, primary_key=True, comment="主键")
3 P; D. b9 U6 _$ [ name = db.Column(db.String(64), unique=True, comment="课程")
6 D D. x' a; F9 l+ } A price = db.Column(db.Numeric(7, 2))6 F3 ?" L& E" t+ p
# repr()方法类似于django的__str__,用于打印模型对象时显示的字符串信息
. R* a# Q. M" y4 T. z def __repr__(self):
9 e- c* B1 O$ @ return f'{self.name}<Course>'# p/ u* J5 v- \- q
1 I& z2 @4 s% M% @class Teacher(db.Model):) l1 z- B$ L1 T& ~& D* F
"""老师数据模型"""8 d- _( a2 l9 ?( B
__tablename__ = "db_teacher"
; F% Y) `4 v% V6 Z b& ` id = db.Column(db.Integer, primary_key=True, comment="主键")& p6 a" U b2 u; b, M5 {
name = db.Column(db.String(64), unique=True, comment="姓名")9 @! `# c/ r' X$ V- b* U0 Y
option = db.Column(db.Enum("讲师", "助教", "班主任"), default="讲师") y" m. e8 \# G/ E4 B
, a" p% K6 K' w+ b+ b7 n. b) W def __repr__(self):
/ i! V* D$ E/ |2 l, S2 b return f"{self.name}< Teacher >"
5 ]/ s" K; S U5 p1 G& T/ ]2 m _ n4 |; E4 u* S& c% K/ S
@app.route("/")* Q8 o4 i9 E" D. v
def index():1 v0 U5 T: M- x5 i
return "ok!"
4 g# p& @8 }) d' H# b9 ^! j8 k: D5 R
if __name__ == '__main__':
, ?# A' S0 `# f7 Z1 e$ w: N# A with app.app_context():
# D* R0 i& K, X) f% K# e* Y9 c # 检测数据库中是否存在和模型匹配的数据表。
0 B+ b% B1 _3 K4 U # 如果没有,则根据模型转换的建表语句进行建表。
( x4 r* l6 ]7 x, X # 如果找到,则不会进行额外处理
. }1 {$ g. E9 D2 a( m db.create_all()
* |& f7 m8 Z# N7 e) u8 T6 y app.run(debug=True)
7 X1 L2 j) S$ z/ q. Y$ S/ ]+ D
" C; m6 p- {! x0 ^ |
|