数据库 和数据库之间的关系

python语言和sql语言的区别_为什么 SQL 程序员也要懂 Python?-CSDN博客


common/models/pay/PayOrder.py

# coding: utf-8
from app import db, app
from sqlalchemy import BigInteger, Column, DateTime, Index, Integer, Numeric, String, Text
from sqlalchemy.schema import FetchedValue


class PayOrder(db.Model):
    __tablename__ = 'pay_order'
    __table_args__ = (
        db.Index('idx_member_id_status', 'member_id', 'status'),
    )

    id = db.Column(db.Integer, primary_key=True)
    order_sn = db.Column(db.String(40), nullable=False, unique=True, server_default=db.FetchedValue(), info='随机订单号')
    member_id = db.Column(db.BigInteger, nullable=False, server_default=db.FetchedValue(), info='会员id')
    total_price = db.Column(db.Numeric(10, 2), nullable=False, server_default=db.FetchedValue(), info='订单应付金额')
    yun_price = db.Column(db.Numeric(10, 2), nullable=False, server_default=db.FetchedValue(), info='运费金额')
    pay_price = db.Column(db.Numeric(10, 2), nullable=False, server_default=db.FetchedValue(), info='订单实付金额')
    pay_sn = db.Column(db.String(128), nullable=False, server_default=db.FetchedValue(), info='第三方流水号')
    prepay_id = db.Column(db.String(128), nullable=False, server_default=db.FetchedValue(), info='第三方预付id')
    note = db.Column(db.Text, nullable=False, info='备注信息')
    status = db.Column(db.Integer, nullable=False, server_default=db.FetchedValue(), info='1:支付完成 0 无效 -1 申请退款 -2 退款中 -9 退款成功  -8 待支付  -7 完成支付待确认')
    express_status = db.Column(db.Integer, nullable=False, server_default=db.FetchedValue(), info='快递状态,-8 待支付 -7 已付款待发货 1:确认收货 0:失败')
    express_address_id = db.Column(db.Integer, nullable=False, server_default=db.FetchedValue(), info='快递地址id')
    express_info = db.Column(db.String(1000), nullable=False, server_default=db.FetchedValue(), info='快递信息')
    comment_status = db.Column(db.Integer, nullable=False, server_default=db.FetchedValue(), info='评论状态')
    pay_time = db.Column(db.DateTime, nullable=False, server_default=db.FetchedValue(), info='付款到账时间')
    updated_time = db.Column(db.DateTime, nullable=False, server_default=db.FetchedValue(), info='最近一次更新时间')
    created_time = db.Column(db.DateTime, nullable=False, server_default=db.FetchedValue(), info='插入时间')

    # @property 是一个装饰器,用于定义类的属性。在你供的代码中,@property 被用来定义了一个名为 pay_status 的属性。这个属性的值是通过计算得到的。
    @property
    def pay_status(self):
        # 首先,将 self.status 赋值给 tmp_status。
        tmp_status = self.status
        # 根据不同的条件对 tmp_status 进行修改
        if self.status == 1:
            tmp_status = self.express_status
            if self.express_status == 1 and self.comment_status == 0:
                tmp_status = -5
            if self.express_status == 1 and self.comment_status == 1:
                tmp_status = 1
        #最后,返回 tmp_status 的值作为 pay_status 的值
        return tmp_status
    # @property是Python中的一个装饰器,用于将一个方法转换为属性。
    @property
    # status_desc方法被@property装饰,它将status_desc方法转换为一个只读属性。
    def status_desc(self):
    # 当你访问status_desc属性时,它会返回app.config[‘PAY_STATUS_DISPLAY_MAPPING’][str(self.pay_status)]的值。
        return app.config['PAY_STATUS_DISPLAY_MAPPING'][str(self.pay_status)]

    # order_number方法也被@property装饰,将order_number方法转换为一个只读属性。
    @property
    def order_number(self):
    # 当你访问order_number属性时,它会根据一定的规则生成一个订单号,并返回该订单号。
        order_number = self.created_time.strftime("%Y%m%d%H%M%S")
        order_number = order_number + str(self.id).zfill(5)
        return order_number
    # 这样使用@property装饰器可以使得这两个方法像属性一样被访问,而不需要使用括号调用方法
    # .zfill(5)是Python中的一个字符串方法,它用于在字符串的左侧填充0,使字符串的总长度达到指定的宽度。
    # 如果字符串的长度已经大于或等于指定的宽度,则不会进行任何填充。
    #
    # 例如,如果我们有一个字符串"123",使用.zfill(5)方法后,它将被填充为"00123",总长度为5。
    #
    # 这个方法非常适用于需要保持字符串长度一致的情况,比如在生成文件名或者格式化输出时。

这是通过

common/models/pay/PayOrderItem.py

# coding: utf-8


from app import db



class PayOrderItem(db.Model):
    __tablename__ = 'pay_order_item'

    id = db.Column(db.Integer, primary_key=True)
    pay_order_id = db.Column(db.Integer, nullable=False, index=True, server_default=db.FetchedValue(), info='订单id')
    member_id = db.Column(db.BigInteger, nullable=False, server_default=db.FetchedValue(), info='会员id')
    quantity = db.Column(db.Integer, nullable=False, server_default=db.FetchedValue(), info='购买数量 默认1份')
    price = db.Column(db.Numeric(10, 2), nullable=False, server_default=db.FetchedValue(), info='商品总价格,售价 * 数量')
    food_id = db.Column(db.Integer, nullable=False, index=True, server_default=db.FetchedValue(), info='美食表id')
    note = db.Column(db.Text, nullable=False, info='备注信息')
    status = db.Column(db.Integer, nullable=False, server_default=db.FetchedValue(), info='状态:1:成功 0 失败')
    updated_time = db.Column(db.DateTime, nullable=False, server_default=db.FetchedValue(), info='最近一次更新时间')
    created_time = db.Column(db.DateTime, nullable=False, server_default=db.FetchedValue(), info='插入时间')


flask-sqlacodegen 'mysql://root:root@127.0.0.1/food_db' --tables pay_order_item --outfile "common/models/pay/PayOrderItem.py"  --flask

上段代码是通过flask-sqlacodegen转换的py代码

SQL代码


DROP TABLE IF EXISTS `pay_order_item`;

CREATE TABLE `pay_order_item` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `pay_order_id` int(11) NOT NULL DEFAULT '0' COMMENT '订单id',
  `member_id` bigint(11) NOT NULL DEFAULT '0' COMMENT '会员id',
  `quantity` int(11) NOT NULL DEFAULT '1' COMMENT '购买数量 默认1份',
  `price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '商品总价格,售价 * 数量',
  `food_id` int(11) NOT NULL DEFAULT '0' COMMENT '美食表id',
  `note` text NOT NULL COMMENT '备注信息',
  `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:1:成功 0 失败',
  `updated_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最近一次更新时间',
  `created_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '插入时间',
  PRIMARY KEY (`id`),
  KEY `id_order_id` (`pay_order_id`),
  KEY `idx_food_id` (`food_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单详情表';

问题: PayOrder.py 与PayOrderItem.py 两个数据库表有什么关系

pay_order表和pay_order_item表之间的关系是一对多关系,通过id字段建立关联。

pay_order_item表中,有一个pay_order_id字段,它是一个外键,指向pay_order表的id字段。这样,每个pay_order_item记录都可以通过pay_order_id字段与对应的pay_order记录建立关联。

换句话说,一个pay_order订单可以对应多个pay_order_item订单详情,而每个pay_order_item订单详情只能属于一个pay_order订单。

问题:如何通过外键建立表之间的关联?

通过外键可以在数据库中建立表之间的关联。键是一个字段或一组字段,它们引用了另一个表中的主键,从而创建了表之间的关系。以下是通过外键建立表之间关联的步骤:

  • 首先,在需要建立关联的表中定义外键字段。这个字段将引用另一个表中的主键。例如,如果有一个名为"Orders"的表和一个名为"Customers"的表,可以在"Orders"表中定义一个外键字段"customer_id",它引用了"Customers"表中的主键。

  • 在创建表时,使用FOREIGN KEY约束来定义外键。在上述例子中,可以使用以下语句在"Orders"表中创建外键:

CREATE TABLE Orders (
  order_id INT PRIMARY KEY,
  customer_id INT,
  FOREIGN KEY (customer_id) REFERENCES Customers(customer_id)
);
  • 确保被引用的表中存在对应的主键。在上述例子中,"Customers"表必须先创建,并且其中的"customer_id"字段必须是主键。

  • 当插入数据时,确保外键字段的值与被引用表中的主键值匹配。如果尝试插入一个不存在的外键值,将会引发错误。

通过以上步骤,就可以通过外键在表之间建立关联。这样可以实现数据的一致性和完整性,并且可以方便地进行表之间的查询和操作。

NOT NULL

SQL NOT NULL 约束_w3cschool

PRIMARY KEY 

SQL PRIMARY KEY 约束_w3cschool

DEFAULT

SQL DEFAULT 约束_w3cschool

KEY

https://www.cnblogs.com/zjfjava/p/6922494.html

  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_order_sn` (`order_sn`),
  KEY `idx_member_id_status` (`member_id`,`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='在线购买订单表';

  PRIMARY KEY (`id`),
  KEY `id_order_id` (`pay_order_id`),
  KEY `idx_food_id` (`food_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单详情表';

这是一段MySQL数据库表的定义语句,其中包含了三个索引的定义:

  1. PRIMARY KEY (id):这是一个主键索引,用于唯一标识每一行数据。主键索引的值必须是唯一的,并且不能为空。

  2. KEY id_order_id (pay_order_id):这是一个普通索引,用于加快根据pay_order_id字段进行查询的速度。普通索引可以包含重复的值。

  3. KEY idx_food_id (food_id):这也是一个普通索引,用于加快根据food_id字段进行查询的速度。

索引是数据库中用于提高查询效率的数据结构,它可以加速数据的查找和排序操作。通过在关键字段上创建索引,可以减少数据库的扫描次数,从而提高查询性能。

这段代码是用于创建数据库表的索引。索引是一种数据结构,用于提高数据库查询的效率。在这段代码中,PRIMARY KEY (id)表示将id列设置为主键,主键是用来唯一标识每一行数据的字段。KEY id_order_id (pay_order_id)表示创建一个名为id_order_id的索引,该索引是基于pay_order_id列的。KEY idx_food_id (food_id)表示创建一个名为idx_food_id的索引,该索引是基于food_id列的。

关于idx的含义,它是索引的命名前缀,通常用于表示该索引是基于某个特定列的。在这段代码中,idx_food_id表示该索引是基于food_id列的。

问题:    idx 中的x是什么意思

在这里,idx只是索引的名称的一部分,它没有特殊的含义。它只是一个命名约定,用于标识索引的类型或作用。在这个例子中,idx可能表示这是一个普通索引。实际上,你可以使用任何你喜欢的名称来标识索引。

ENGINE=InnoDB是MySQL数据库中的一个参数,用于指定表的存储引擎。InnoDB是一种支持事务和行级锁定的存储引擎,它提供了高度可靠性和高性能的数据存储和检索功能。

DEFAULT CHARSET=utf8mb4是指定表的默认字符集为utf8mb4。utf8mb4是一种字符编码,支持存储和显示更广泛的字符集,包括emoji表情符号等。

COMMENT='订单详情表’是对表的注释,用于描述表的用途或特点。在创建表时,可以添加注释以便于开发人员理解和维护表结构。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xinzheng新政

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值