首页 > 其他分享 >11、ORM外键与表关系

11、ORM外键与表关系

时间:2024-03-25 14:12:44浏览次数:18  
标签:11 name app db 外键 ORM user id User


from config import app, db
from model import User, Article
import flask_bcrypt
from flask import render_template


@app.route("/")
def hello_world():
    return "hello flask!"


# 添加用户
@app.route("/user/add")
def user_add():
    password = flask_bcrypt.generate_password_hash("88888888")
    # 创建ORM对象
    user = User(name="Tina", email="[email protected]", password=password)
    # 将ORM对象添加到db.session中
    db.session.add(user)
    # 将db.session中的数据同步至数据库.
    db.session.commit()
    return "用户添加成功!"


# 数据查询
@app.route("/user/query/<int:user_id>")
def user_query(user_id=1):
    # # 1. get查询 根据主键值进行查询
    # user = User.query.get(user_id)
    # if user:
    #     ret = {"ID": user.id, "name": user.name, "email": user.email}
    #     return f"数据查找成功{ret}"
    # return "未找到该用户信息!"

    # 2. filter_by 查找 (普遍用的比较多)
    users = User.query.filter_by(id=user_id)
    # users: Query对象
    ret = []
    for user in users:
        ret.append({"ID": user.id, "name": user.name, "email": user.email})
    if ret:
        return f"数据查找成功{ret}"
    return "未找到用户信息!"


@app.route("/user/update/<int:user_id>")
def user_update(user_id=1):
    user = User.query.filter_by(id=user_id).first()
    if user:
        user.email = "[email protected]"
        db.session.commit()
        return "数据更新成功!"
    return "未找到用户信息!"


@app.route("/user/delete/<int:user_id>")
def user_delete(user_id=1):
    user = User.query.get(user_id)
    if user:
        db.session.delete(user)
        db.session.commit()
        return "数据删除成功!"
    return "未找到用户信息!"


# 下面为新内容 增加article 
@app.route("/article/add")
def article_add():
    article1 = Article(title="Flask学习", content="Flask学习...")
    # 通过author赋值 直接赋值了一个对象.
    article1.author = User.query.get(1)

    article2 = Article(title="Flask学习2", content="Flask学习2...")
    # 通过author_id赋值.赋值id,会自动生成类对象(article.author)
    article2.author_id = 1

    # 添加道session中
    db.session.add_all([article1, article2])
    db.session.commit()
    # 此处增加{article1.author.name}, {article2.author.name}显示,验证一下article下的author
    return f"文章添加成功!{article1.author.name}, {article2.author.name}"


@app.route("/article/query")
def article_query():
    user = User.query.get(1)
    articles = user.articles
    # 这里使用了html模板,继承,循环语句,复习一下前面的知识.
    return render_template("article.html", articles=articles)


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5001, debug=True)
配置文件(config.py)
 
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

# 主机IP地址
HOSTNAME = "127.0.0.1"
# MySql的监听端口号,默认3306
PORT = 3306
# 用户名,密码,自己设置的
USERNAME = "root"
PASSWORD = "root"
# MySql上创建的数据库名称.
DATABASE = "database_learn"


app.config['SQLALCHEMY_DATABASE_URI'] = \
    f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8"


# 在app.config中设置好连接数据库信息.
# 然后使用SQLAlchemy(app)创建db对象,SQLAlchemy就会自动读取app.config中设置的连接信息.
# 读取的就是上面这个设置的地方app.config['SQLALCHEMY_DATABASE_URI']
db = SQLAlchemy(app)

# 测试连接是否成功!
# 涉及到Flask上下文的问题,所以需要加上with app.app_context().
# with app.app_context():
#     with db.engine.connect() as conn:
#         # 注意这里需要加上text(),不然会报错
#         # sqlalchemy.exc.ObjectNotExecutableError: Not an executable object: 'select 1 from dual'
#         # 需要导入from sqlalchemy import text
#         ret = conn.execute(text("select 1 from dual"))
#         # 正常的话的应该返回(1,)
#         print(ret.fetchone())
数据模块(model.py)
 from config import db


# 继承db.Model固定写法.
class User(db.Model):
    # 这里table和tablename还是要区分清楚的.不然会报错
    # "AttributeError: 'str' object has no attribute 'c'"
    # 可以使用tablename
    # __table__ = "users"
    __tablename__ = "user"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(80), nullable=False)
    email = db.Column(db.String(140), nullable=False)
    password = db.Column(db.String(128))
    # 使用back_populates关键词,需要两个类都绑定.
    # articles = db.relationship("Article", back_populates="author")

    def __init__(self, name, email, password):
        self.name = name
        self.email = email
        self.password = password


# 新增加内容,文章类.
class Article(db.Model):
    __tablename = "article"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.String(200), nullable=False)
    content = db.Column(db.Text, nullable=False)
    # 添加作者的外键.
    author_id = db.Column(db.Integer, db.ForeignKey("user.id"))
    # 不过如果是多人开发的话,建议使用back_populates.在User类和Article类中都写明.这样的话,比较直观
    # 看到User类就直观的能使用articles来获取作者的文章列表.
    # author = db.relationship("User", back_populates="articles")
    # backref会给User类添加一个articles属性,获取文件列表.
    author = db.relationship("User", backref="articles")
创建库(createdb.py)
import flask_bcrypt
import config
from model import User


# # 涉及到Flask上下文的问题,所以需要加上with app.app_context().
with config.app.app_context():
    config.db.create_all()
    password = flask_bcrypt.generate_password_hash("88888888")
    tina = User(name="Tina", email="[email protected]", password=password)

    config.db.session.add(tina)
    # 插入数据需要提交
    config.db.session.commit()
模板文件(base.html,article.html)
 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
<!--    这里通过挖坑(block)的方式定义标题-->
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
<!--同理这里是也是挖坑(block).-->
<!--加入这里就是导航条-->
<ul>
    <li><a href="#">首页</a></li>
    <li><a href="#">新闻</a></li>
</ul>
{% block body %}
{% endblock %}
<footer>这是底部的标签</footer>
</body>
</html>
<!--以上为模板文件base.html-->
{% extends "base.html" %}
{% block title %}
我的文章
{% endblock %}
{% block body %}
<div>文章信息:<br></div>
{% for article in articles %}
<div>
    文章: {{ article.title }}, 作者: {{ article.author.name }} <br>
</div>
{% endfor %}
{% endblock %}
<!--以上为模板文件article.html-->

实际查询出来的效果:

标签:11,name,app,db,外键,ORM,user,id,User
From: https://www.cnblogs.com/pythonex/p/18094257

相关文章

  • win11资源管理器卡死(任务栏应用图标朦胧/系统时间不更新/应用图标点击无响应)
    目录传送门前言一、临时快速解决办法二、永久解决三、其他解决推荐传送门SpringMVC的源码解析(精品)Spring6的源码解析(精品)SpringBoot3框架(精品)MyBatis框架(精品)MyBatis-PlusSpringDataJPASpringCloudNetflixSpringCloudAlibaba(精品)ShiroSpringSecurityjava的......
  • Python基础练习 --- 从易到难(11-20)
    文章目录11.判断1-100偶数个数12.发工资13.ATM14.取出列表偶数15.分割字符串16.序列的切片17.升职加薪18.剪刀石头布19.打印直角三角形20.打印等腰三角形11.判断1-100偶数个数count=0forxinrange(1,101):ifx%2==0:count+=1print(f"1......
  • 【go】gorm中去掉默认表名后的s复数形式
    【go】gorm中去掉默认表名后的s复数形式背景使用gorm时,查询数据时mysql报错,显示表名不存在,仔细查看,报错的表名中增加了s,比如实际数据库表名是:ali_user,报错信息中显示表ali_users不存在原因gorm默认使用结构体的复数形式作为表名比如:#表结构体定义如下:typeAliUserstruc......
  • 代码之外周刊(第111期):哈佛世纪研究:何为幸福生活?
    亲爱的读者们:很高兴地宣布,「一周精彩内容分享」系列将更名为「代码之外周刊」。这个新名称更好地反映了我想分享的不仅仅是代码知识,还有那些能够启发思考、拓宽视野的内容。我希望「代码之外周刊」能成为您探索技术和技术之外世界的小窗口,能带给您更多灵感和惊喜。感谢您一直以......
  • 【技术贴】Windows 11桌面出现“了解此图片”图标?一招教你轻松解决!
        亲爱的朋友们,大家好!近期,随着Windows11的更新与普及,一些用户反映他们的电脑桌面上意外出现了一个名为“了解此图片”的图标,并且桌面背景还会不请自来地自动更换,让人感到既困惑又无奈。    如果你也遇到了同样的问题,而且正在寻找一种简单快捷的方法来摆脱......
  • 马斯克开源的 grok-1 底层 Transformer 模型论文 《Attention is All You Need》
    拓展阅读马斯克开源的grok-1底层Transformer模型论文《AttentionisAllYouNeed》马斯克开源的grok-1大模型底层Transformer模型到底是个啥?马斯克开源的grok-1大模型硬核源码第1弹马斯克开源的grok-1大模型硬核源码第2弹马斯克开源的grok-1大模型硬核源......
  • 20211102尹子扬DER编码
    二进制编码代码如下(只列举一个,其他类似)点击查看代码echo-n"CN"|od-tc-tx1创建一个der文件点击查看代码touch20211102.der按照要求编译文件点击查看代码echo-n-e"\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x43\x4E">20211102.deropensslasn1pa......
  • Django Forms组件,展示用户输入不合规的提示信息,钩子函数
    DjangoForms组件,展示用户输入不合规的提示信息,钩子函数前戏:使用form表单,用户输入特定信息,比如:金瓶,输入框右侧提示信息,不使用Ajax。前端代码:<body><formaction=""method="post"><p>username:<inputtype="text"name="username"><......
  • Python Flask框架 -- ORM模型外键与表关系
    表关系关系型数据库一个强大的功能,就是多个表之间可以建立关系。比如文章表中,通常需要保存作者数据,但是我们不需要直接把作者数据放到文章表中,而是通过外键引用用户表。这种强大的表关系,可以存储非常复杂的数据,并且可以让查询非常迅速。在Flask-SQLAlchemy中,同样也支持表关系......
  • 代码随想录算法训练营Day54 ||leetCode 392.判断子序列 || 115.不同的子序列
    392.判断子序列 双指针遍历,比较简单易懂classSolution{public:boolisSubsequence(strings,stringt){inta=0,b=0;while(a<s.size()&&b<t.size()){if(s[a]==t[b]){a++;}......