# pip3 install flask
# Successfully installed Jinja2-3.1.2 MarkupSafe-2.1.1 Werkzeug-2.1.2 click-8.1.3 flask-2.1.2 itsdangerous-2.1.2
# pip3 install pymysql
# Successfully installed pymysql-1.0.2
# pip3 install flask-sqlalchemy
# Successfully installed SQLAlchemy-1.4.36 flask-sqlalchemy-2.5.1
需求:
有作家-WriterModel、个人信息-WriterExtensionModel 和书籍-BookModel,
一个作家只有1套个人信息;
一个作家可以有多本书;
一本书只有一个作者。
一对多
control/mysql_config.py
1 2 3 4 5 6 7 8 |
HOSTNAME = '127.0.0.1' # 数据库ip PORT = '3306' # port DATABASE = 'db_flask' # 库,已存在 USERNAME = 'root' # 用户 PASSWORD = 'root' # 密码 # 首先,mysql.server start ,启动服务 SQL_URI = f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8' # mysql.server stop ,停止服务 |
config_flask.py
1 2 3 4 5 |
# flask配置参数文档 https://flask.palletsprojects.com/en/2.1.x/config/ JSON_AS_ASCII = False # json中 true:显示ascii,false:显示汉字 from control import mysql_config SQLALCHEMY_DATABASE_URI = mysql_config.SQL_URI |
control/mysql_master.py
【方式1】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
from flask_sqlalchemy import SQLAlchemy print("被加载了") db = None # ################################### 初始化数据库,创建表 def init(_app): global db db = SQLAlchemy(_app) # db.init_app(_app) print('数据库工具初始化了') # ORM模型 # https://qastack.cn/programming/22698478/what-is-the-difference-between-the-declarative-base-and-db-model global WriterModel class WriterModel(db.Model): # 作家表 - 『一』 __tablename__ = 'tb_writer' id = db.Column(db.Integer, primary_key=True, autoincrement=True) # 此字段是tb_book的外键 name = db.Column(db.String(200), nullable=False) # 【1】自定义属性books,向BookModel注入一个writer属性-用来让bookmodel关联作家, # 此属性不能与bookmodel已有的字段重名。并且不会实际创建到book表中 books = db.relationship("BookModel", backref = "writer") global BookModel class BookModel(db.Model): # 书籍表 - 『多』 __tablename__ = 'tb_book' id = db.Column(db.Integer, primary_key=True, autoincrement=True) name = db.Column(db.String(200), nullable=False) # 【2】外键是‘writer’表(对应WriterModel)的主键字段。如果nullable=False,则删除“作家”时,必须没有关联的书籍,否则IntegrityError: (pymysql.err.IntegrityError) (1048, "Column 'writer_id' cannot be null") writer_id = db.Column(db.Integer, db.ForeignKey('tb_writer.id')) # , nullable=False db.drop_all() # 清空db中已有的表-不删除表 db.create_all() # 自动根据ORM模型创建尚不存在的表 def insert(): # 演示。数据来自网页请求 w1 = WriterModel(name = '鲁迅') w2 = WriterModel(name = '朱自清') # db.session.add(w) # 这一步可省略 # 插入方式1: # 【3】当添加‘多’的时,就可以使用注入的属性‘writer’进行操作 # b1 = BookModel(name = '孔乙己', writer = w1) # b2 = BookModel(name = '朝花夕拾', writer = w2) # b3 = BookModel(name = '彷徨', writer = w1) # db.session.add_all([b1, b2, b3]) # 插入bookmodel时,自动将writermodel插入 # 插入方式2: b1 = BookModel(name = '孔乙己') b2 = BookModel(name = '朝花夕拾') b3 = BookModel(name = '彷徨') w1.books = [b1, b2, b3] # 1对多。# 自动将bookmodel插入 db.session.add_all([w1, w2]) db.session.commit() print('插入了==作者=书=') # 修改 w1.name = "鲁迅大人" # db.session.add(w1) db.session.commit() # 删除 db.session.delete(w1) db.session.commit() # 查询 result = db.session.query(BookModel) result = result.all() print('这啥', type(result)) print('这啥', result) |
【方式2】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
global WriterModel class WriterModel(db.Model): # 作家表 - 一 __tablename__ = 'tb_writer' id = db.Column(db.Integer, primary_key=True, autoincrement=True) # 此字段是tb_book的外键 name = db.Column(db.String(200), nullable=False) global BookModel class BookModel(db.Model): # 书籍表 - 多 __tablename__ = 'tb_book' id = db.Column(db.Integer, primary_key=True, autoincrement=True) name = db.Column(db.String(200), nullable=False) # 【1】.外键是‘writer’表(对应WriterModel)的主键字段。 writer_id = db.Column(db.Integer, db.ForeignKey('tb_writer.id')) # 【2】.自定义属性writer,向WriterModel注入一个books属性-用来让WriterModel关联其写的全部书籍 writer = db.relationship("WriterModel", backref = "books") ... 省略代码... print('作品', w1.name, w1.books) # 查作家的全部书籍 print('作品', w2.name, w2.books) |
app.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
from flask import Flask # 主程 from control import mysql_master import config_flask # 参数配置自定义文件 # 创建app对象 # app = Flask(__name__, template_folder=r'templates') # template_folder设置网页模板文件路径,相对或绝对 app = Flask(__name__) # debug模式 app.debug = True # 默认false。true:开启debug模式,编辑状态下热更新 # 参数配置 # app.config['JSON_AS_ASCII'] = False # 方式1 app.config.from_object(config_flask) # 方式2,更方便管理 # 必须在app.run()之前,初始化SQLAlchemy mysql_master.init(app) mysql_master.insert() if '__main__' == __name__: # 如果是主程序 # app.run(debug=True) # 启动服务,开启调试。 app.run(use_reloader=False) # 启动服务。false:关闭热更新 |
启动站点
1 |
python3 app.py |
一对一
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
global WriterModel class WriterModel(db.Model): # 作家表 - 一 __tablename__ = 'tb_writer' id = db.Column(db.Integer, primary_key=True, autoincrement=True) name = db.Column(db.String(200), nullable=False) print('定义了作家类====') global WriterExtensionModel class WriterExtensionModel(db.Model): # 作家个人信息表 - 一 __tablename__ = 'tb_writer_ext' id = db.Column(db.Integer, primary_key=True, autoincrement=True) # 1.外键 writer_id = db.Column(db.Integer, db.ForeignKey('tb_writer.id')) # 2.外键 向WriterModel注入ext。【uselist=False表示只能注入1个ExtensionModel】 writer = db.relationship("WriterModel", backref = db.backref("ext", uselist=False)) birthdate = db.Column(db.String(200)) nativeplace = db.Column(db.String(200)) print('定义了作家个人信息类====') ...略... luxun = WriterExtensionModel(birthdate="1881年9月25日-1936年10月19日", nativeplace="浙江绍兴人") zhuziqing = WriterExtensionModel(birthdate="1898年11月22日-1948年8月12日", nativeplace="生于江苏东海,长大于江苏扬州") w1 = WriterModel(name = '鲁迅') # w1.ext = luxun # 方式1 # w1.ext = [luxun, zhuziqing] # 因为是1对1关系,所以 AttributeError: 'list' object has no attribute '_sa_instance_state' luxun.writer = w1 # 方式2 w2 = WriterModel(name = '朱自清') w2.ext = zhuziqing # 1对1 ...略... db.session.add_all([w1, w2]) db.session.commit() |
- end
本文由崔维友 威格灵 cuiweiyou vigiles cuiweiyou 原创,转载请注明出处:http://www.gaohaiyan.com/3906.html
承接App定制、企业web站点、办公系统软件 设计开发,外包项目,毕设