【postgresql】数据表id自增与python sqlachemy结合实例

需求:
postgresql实现一个建表语句,表名:student,字段id,name,age,
要求:每次添加一个数据id会自动增加1

在PostgreSQL中,您可以使用SERIAL或BIGSERIAL数据类型来自动生成主键ID。以下是一个创建名为student的表的SQL语句,该表包含id、name和age字段,其中id字段会自动递增:
sql

CREATE TABLE student (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    age INT NOT NULL
);

在这个建表语句中:

  • id字段被设置为SERIAL类型,这意味着每当您向表中插入新行时,id字段的值会自动增加1。
    PRIMARY KEY约束表示id字段是表的主键,它在表中是唯一的,并且不能为NULL。
  • name字段被设置为VARCHAR(255)类型,这是一个可变长度的字符串,最大长度为255个字符。
  • age字段被设置为INT类型,用于存储整数值。

请注意,SERIAL类型是一个整数类型,它会在插入新行时自动增加,但它的值有上限。如果您需要一个更大的数字范围,可以使用BIGSERIAL类型,它与SERIAL类型类似,但可以存储更大的数字。
要向student表中插入数据,您可以使用以下INSERT语句:

INSERT INTO student (name, age) VALUES ('John Doe', 20);
INSERT INTO student (name, age) VALUES ('Tom', 20);

在这个INSERT语句中,您不需要指定id字段,因为它会自动生成。
在这里插入图片描述

ORM操作

# -- coding:utf-8 --
from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

Base = declarative_base()

class User(Base):
    __tablename__ = 'student'
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(50), nullable=False)
    age = Column(Integer, nullable=False)

# 创建引擎和会话
engine = create_engine('postgresql://admin:admin@192.168.1.1/post')
Session = sessionmaker(bind=engine)
session = Session()

# 创建一个新用户
new_user = User(name='johndoe', age=18)
session.add(new_user)
session.commit()

数据插入成功:
在这里插入图片描述

SERIAL数据类型

如果您的表已经创建,但使用的是INT类型作为主键,并且您想要修改它成为一个自动递增的SERIAL类型,您可以使用ALTER TABLE语句来修改列的数据类型并将其设置为主键。以下是一个例子,展示了如何将现有表users中的id列修改为SERIAL类型:

ALTER TABLE users
MODIFY id SERIAL PRIMARY KEY;

这个命令会改变users表中id列的数据类型为SERIAL,并且将其设置为表的主键。如果id列已经包含数据,这个操作会自动为现有的每个id值分配一个唯一的序列值。
如果您想要保留id列的现有数据并仅为新插入的行生成序列值,您可以使用ALTER TABLE ... ALTER COLUMN ... RESTART命令:

ALTER TABLE users
ALTER COLUMN id RESTART WITH 1;

这个命令会将id序列重新启动,设置下一个插入的行的id值为1。这将不会影响表中已经存在的行。
请注意,这些命令应该在数据库服务器上直接执行,而不是通过应用程序。如果您正在使用SQLAlchemy或其他ORM框架,您可能需要先迁移现有的数据,然后再修改表结构。

案例:
如果之前建表语句中id 用的int类型,怎么修改成SERIAL类型:
如果您的表已经创建,但使用的是INT类型作为主键,并且您想要修改它成为一个自动递增的SERIAL类型,您可以使用ALTER TABLE语句来修改列的数据类型并将其设置为主键。以下是一个例子,展示了如何将现有表users中的id列修改为SERIAL类型:

ALTER TABLE users
MODIFY id SERIAL PRIMARY KEY;

这个命令会改变users表中id列的数据类型为SERIAL,并且将其设置为表的主键。如果id列已经包含数据,这个操作会自动为现有的每个id值分配一个唯一的序列值。
如果您想要保留id列的现有数据并仅为新插入的行生成序列值,您可以使用ALTER TABLE ... ALTER COLUMN ... RESTART命令:

ALTER TABLE users
ALTER COLUMN id RESTART WITH 1;

这个命令会将id序列重新启动,设置下一个插入的行的id值为1。这将不会影响表中已经存在的行。
请注意,这些命令应该在数据库服务器上直接执行,而不是通过应用程序。如果您正在使用SQLAlchemy或其他ORM框架,您可能需要先迁移现有的数据,然后再修改表结构。

SERIAL 与BIGSERIAL的区别

SERIALBIGSERIAL是PostgreSQL中用于自动递增整数键的数据类型,它们之间的主要区别在于可以存储的数值范围:

  1. SERIAL:它是INTEGER类型的一个别名,用于自动递增的整数。SERIAL类型的取值范围与INTEGER类型相同,理论上限是2^31 - 1(2147483647),但实际上由于系统限制,可能会有所不同。
  2. BIGSERIAL:它是BIGINT类型的一个别名,用于自动递增的更大范围的整数。BIGSERIAL类型的取值范围与BIGINT类型相同,理论上限是2^63 - 1(9223372036854775807)。
    在选择SERIALBIGSERIAL时,您应该根据您的应用程序所需的ID范围来决定。如果您预计ID值会非常大,或者有可能达到INTEGER类型的上限,那么应该使用BIGSERIAL。如果您确信ID值会在INTEGER类型的范围内,那么SERIAL将是更高效的选择,因为它在存储和处理上消耗的资源更少。
    例如,如果您正在构建一个可能会有数百万或更多用户的大规模应用程序,并且用户ID需要有很大的范围,那么使用BIGSERIAL会是更合适的选择。如果您构建的是一个小型应用程序,用户数量有限,那么SERIAL可能就足够了。
    在创建表时,您可以这样定义这两个类型:
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    -- ...
);
CREATE TABLE large_users (
    id BIGSERIAL PRIMARY KEY,
    -- ...
);

在SQLAlchemy中,您可以这样指定这些类型:

from sqlalchemy import Column, Integer, BigInteger
class SmallUser(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    # ...
class LargeUser(Base):
    __tablename__ = 'large_users'
    id = Column(BigInteger, primary_key=True)
    # ...

在这个例子中,SmallUser类使用Integer类型,而LargeUser类使用BigInteger类型,后者可以存储更大的数值。在SQLAlchemy中,BigInteger类型对应于PostgreSQL中的BIGINT类型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/410417.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter系列(1)Mac下载安装启动

目录 Jmeter下载安装启动下载启动 Jmeter下载安装启动 注意⚠️:使用jmeter需要有java环境 下载 官网下载地址:https://jmeter.apache.org/ 会看到这里有两个版本,那么有什么区别么? Binaries是可执行版,直接下载解…

韩国量子之梦:将量子计算纳入新增长 4.0战略

内容来源:量子前哨(ID:Qforepost) 编辑丨王珩 编译/排版丨沛贤 深度好文:1500字丨9分钟阅读 据《朝鲜邮报》报道,韩国将推出由量子计算加速的云服务,并在首尔地区启动城市空中交通的试飞&…

企业过二级等保采购哪家堡垒机好?

企业常见过等保,一般是指等保二级或者三级。这不2024开年,不少企业在问,过二级等保采购哪家堡垒机好?电话多少?这里我们小编就给大家毛遂自荐一下吧! 企业过二级等保采购哪家堡垒机好? 【回答】…

Spring Boot Profiles简单介绍

Spring Boot application.properties和application.yml文件的配置 阅读本文之前,请先阅读上面的配置文件介绍。 Spring Boot Profiles是一个用于区分不同环境下配置的强大功能。以下是如何在Spring Boot应用程序中使用Profiles的详细步骤和代码示例。 1. 创…

一周学会Django5 Python Web开发-Django5命名空间namespace

锋哥原创的Python Web开发 Django5视频教程: 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计25条视频,包括:2024版 Django5 Python we…

2024年2月20日v1.0.5更新·优雅草便民工具youyacao-tools

2024年2月20日v1.0.5更新优雅草便民工具youyacao-tools apk下载 https://fenfacun.youyacao.com/tools105.apk 介绍 优雅草便民工具是一款由成都市一颗优雅草科技有限公司打造的便民查询公益工具,2024年1月17日正式发布v1.0.0版本,本工具为了方便大众免…

Linux-部署各类软件(黑马学习笔记)

MYSQL MYSQL5.7版本在CentOS系统安装 注意:安装操作需要root权限 MySQL的安装我们可以通过前面学习的yum命令进行。 安装 1.配置yum仓库 # 更新密钥 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022# 安装Mysql yum库 rpm -Uvh http://repo.mysql.…

运维管理制度优化:确保IT系统稳定运行的关键策略

1、总则 第一条:为保障公司信息系统软硬件设备的良好运行,使员工的运维工作制度化、流程化、规范化,特制订本制度。 第二条:运维工作总体目标:立足根本促发展,开拓运维新局面。在企业发展壮大时期&#x…

pytorch保存张量为图片

这里用到的是torchvision中的save_image。 废话不多说,直接来代码: import torch from torchvision.utils import save_image B, C, H, W 64, 3, 32, 32 input_tensor torch.randn(B, C, H, W) save_image(input_tensor, "hh.png", nrow8)…

力扣随笔删除有序数组中的重复项(简单26)

思路:根据类似于滑动窗口的思想,定义一个指针;使指针左边的区域全部为不重复元素(包括指针所指的数字) 以示例2为例,left:红色加粗 遍历指针i:黑色加粗 窗口范围,左边界到…

庖丁解牛-二叉树的遍历

庖丁解牛-二叉树的遍历 〇、前言 01 文章内容 一般提到二叉树的遍历,我们是在说 前序遍历、中序遍历、后序遍历和层序遍历 或者说三序遍历层序遍历,毕竟三序和层序的遍历逻辑相差比较大下面讨论三序遍历的递归方法、非递归方法和非递归迭代的统一方法然…

调度服务看门狗配置

查看当前服务器相关的sqlserver服务 在任务栏右键,选择点击启动任务管理器 依次点击,打开服务 找到sqlserver 相关的服务, 确认这些服务是启动状态 将相关服务在看门狗中进行配置 选择调度服务,双击打开 根据上面找的服务进行勾…

MTR(My Traceroute)网络链路路由测试工具

一、MTR的介绍 MTR是一款网络诊断工具,它将ping和traceroute的功能结合到一个程序中。这个工具可以提供关于网络链路的详细信息,显示数据包在网络上的传输路径,并提供有关每个节点的详细信息,如丢包率、延迟等。与传统的traceroute工具相比&a…

Python爬虫-爬取B站番剧封面

本文是本人最近学习Python爬虫所做的小练习。如有侵权,请联系删除。 页面获取url 代码 import requests import os import re# 创建文件夹 path os.getcwd() /images if not os.path.exists(path):os.mkdir(path)# 当前页数 page 1 # 总页数 total_page 2# 自动…

淘宝天猫商品详情API接口(商品详情页面数据,销量接口)

淘宝商品详情API接口,淘宝商品销量接口,淘宝商品价格接口,淘宝商品列表接口,淘宝商品数据列表接口,淘宝关键词搜索列表接口,淘宝APP详情接口,淘宝APP商品详情接口,淘宝H5详情接口&am…

【FPGA】线性反馈移位寄存器(LFSR)的Verilog实现

什么是移位寄存器 移位寄存器:是指多个寄存器并排相连,前一个寄存器的输出作为下一个寄存器的输入,寄存器中存放的数据在每个时钟周期向左或向右移动一位。 下面的右移移位寄存器因为左侧没有有效输入,所以在第4个时钟周期&…

【C语言】linux内核netdev_start_xmit函数

一、中文注释 static inline netdev_tx_t netdev_start_xmit(struct sk_buff *skb, struct net_device *dev, struct netdev_queue *txq, bool more) {// 获取网络设备操作集合const struct net_device_ops *ops dev->netdev_ops;int rc;// 调用实际发送数据包的函数&…

2024年环境安全科学、材料工程与制造国际学术会议(ESSMEM2024)

【EI检索】2024年环境安全科学、材料工程与制造国际学术会议(ESSMEM2024) 会议简介 我们很高兴邀请您参加将在三亚举行的2024年环境安全科学、材料工程和制造国际学术会议(ESSMEM 2024)。 ESSMEM2024将汇集世界各国和地区的研究人员&…

前后端分离Vue+node.js在线学习考试系统gqw7o

与其它应用程序相比,在线学习平台的设计主要面向于学校,旨在为管理员和学生、教师、院系提供一个在线学习平台。学生、教师、院系可以通过系统及时查看公告信息等。 在线学习平台是在Windows操作系统下的应用平台。为防止出现兼容性及稳定性问题&#xf…

前端网页位置

网页可见区域高:document.body.clientHeight(不包括边线的高) 网页可见区域高:document.body.offsetHeight(包括边线的高) 网页正文全文高:document.body.scrollHeight 网页被卷去的高度&#x…