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

2024-02-27 16:52

本文主要是介绍【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 sessionmakerBase = 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类型。

这篇关于【postgresql】数据表id自增与python sqlachemy结合实例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/753046

相关文章

如何将Python彻底卸载的三种方法

《如何将Python彻底卸载的三种方法》通常我们在一些软件的使用上有碰壁,第一反应就是卸载重装,所以有小伙伴就问我Python怎么卸载才能彻底卸载干净,今天这篇文章,小编就来教大家如何彻底卸载Pyth... 目录软件卸载①方法:②方法:③方法:清理相关文件夹软件卸载①方法:首先,在安装python时,下

SQL表间关联查询实例详解

《SQL表间关联查询实例详解》本文主要讲解SQL语句中常用的表间关联查询方式,包括:左连接(leftjoin)、右连接(rightjoin)、全连接(fulljoin)、内连接(innerjoin)、... 目录简介样例准备左外连接右外连接全外连接内连接交叉连接自然连接简介本文主要讲解SQL语句中常用的表

python uv包管理小结

《pythonuv包管理小结》uv是一个高性能的Python包管理工具,它不仅能够高效地处理包管理和依赖解析,还提供了对Python版本管理的支持,本文主要介绍了pythonuv包管理小结,具有一... 目录安装 uv使用 uv 管理 python 版本安装指定版本的 Python查看已安装的 Python

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Python中局部变量和全局变量举例详解

《Python中局部变量和全局变量举例详解》:本文主要介绍如何通过一个简单的Python代码示例来解释命名空间和作用域的概念,它详细说明了内置名称、全局名称、局部名称以及它们之间的查找顺序,文中通... 目录引入例子拆解源码运行结果如下图代码解析 python3命名空间和作用域命名空间命名空间查找顺序命名空

Python如何将大TXT文件分割成4KB小文件

《Python如何将大TXT文件分割成4KB小文件》处理大文本文件是程序员经常遇到的挑战,特别是当我们需要把一个几百MB甚至几个GB的TXT文件分割成小块时,下面我们来聊聊如何用Python自动完成这... 目录为什么需要分割TXT文件基础版:按行分割进阶版:精确控制文件大小完美解决方案:支持UTF-8编码

基于Python打造一个全能文本处理工具

《基于Python打造一个全能文本处理工具》:本文主要介绍一个基于Python+Tkinter开发的全功能本地化文本处理工具,它不仅具备基础的格式转换功能,更集成了中文特色处理等实用功能,有需要的... 目录1. 概述:当文本处理遇上python图形界面2. 功能全景图:六大核心模块解析3.运行效果4. 相

Python中的魔术方法__new__详解

《Python中的魔术方法__new__详解》:本文主要介绍Python中的魔术方法__new__的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、核心意义与机制1.1 构造过程原理1.2 与 __init__ 对比二、核心功能解析2.1 核心能力2.2

Python虚拟环境终极(含PyCharm的使用教程)

《Python虚拟环境终极(含PyCharm的使用教程)》:本文主要介绍Python虚拟环境终极(含PyCharm的使用教程),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录一、为什么需要虚拟环境?二、虚拟环境创建方式对比三、命令行创建虚拟环境(venv)3.1 基础命令3

Python Transformer 库安装配置及使用方法

《PythonTransformer库安装配置及使用方法》HuggingFaceTransformers是自然语言处理(NLP)领域最流行的开源库之一,支持基于Transformer架构的预训练模... 目录python 中的 Transformer 库及使用方法一、库的概述二、安装与配置三、基础使用:Pi