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
PRIMARY KEY
DEFAULT
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数据库表的定义语句,其中包含了三个索引的定义:
-
PRIMARY KEY (
id
):这是一个主键索引,用于唯一标识每一行数据。主键索引的值必须是唯一的,并且不能为空。 -
KEY
id_order_id
(pay_order_id
):这是一个普通索引,用于加快根据pay_order_id
字段进行查询的速度。普通索引可以包含重复的值。 -
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='订单详情表’是对表的注释,用于描述表的用途或特点。在创建表时,可以添加注释以便于开发人员理解和维护表结构。