【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: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

nudepy,一个有趣的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - nudepy。 Github地址:https://github.com/hhatto/nude.py 在图像处理和计算机视觉应用中,检测图像中的不适当内容(例如裸露图像)是一个重要的任务。nudepy 是一个基于 Python 的库,专门用于检测图像中的不适当内容。该

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |

HTML提交表单给python

python 代码 from flask import Flask, request, render_template, redirect, url_forapp = Flask(__name__)@app.route('/')def form():# 渲染表单页面return render_template('./index.html')@app.route('/submit_form',