Python向PostgreSQL插入NULL值及常见提交陷阱解析

慢慢来
慢慢来
发布时间:2026-10-14 | 4人浏览过
原创

本文探讨在Python中向PostgreSQL插入NULL值的方法,重点分析因未正确提交事务导致数据未写入的常见错误。通过对比错误与正确的连接对象使用方式,指出多次调用connection()可能返回不同实例导致commit失效的问题,并提供修复方案以确保数据持久化。

在数据库操作中,插入NULL值通常是必要的。

在Python中,目前尚未找到直接通过SQL语句插入NULL值的简便方式。

推荐使用现有的成熟解决方案。


def insert_sample_data(self, values): # added self since you are referencing it below
 with self.con.cursor() as cur:
  sql = "insert into sampletable values (%s, %s, %s)" # Use %s for parameters
  cur.executemany(sql, values) # Pass the list of tuples directly
  self.con.commit()
 
list1 = [(1100, 'abc', '{"1209": "Y", "1210": "Y"}'), (1100, 'abc', None)]
self.insert_sample_data(list1) # pass the list directly

补充:Python连接数据库插入数据时遇到的常见坑。

在Python中执行插入数据操作后,虽然未报错,但数据库中并未出现新添加的数据。

原因分析:

缺少提交操作。

解决方案:

Python操作数据库时,若对数据表进行增删改等控制操作,系统会将操作暂存在内存中,只有执行commit()方法,才会将操作正式提交到数据库。

然而,总有一些意想不到的陷阱。代码如下:


import pymysql 
class Connection: 
 def __init__(self):
  self.host = 'localhost'
  self.user = 'nameit'
  self.password = 'YES'
  self.port = 3306
  self.db = 'Xomai' 
 
 def connection(self): 
  db = pymysql.connect(host=self.host, user=self.user, password=self.password, port=self.port, db=self.db)
  cur = db.cursor()
  return db, cur
 
 def create_table(self, cur): 
  sql = """CREATE TABLE `activity_feedback` (
     `id` bigint(20) NOT NULL AUTO_INCREMENT,
     `inst_id` bigint(20) DEFAULT NULL COMMENT 'ID',
     `broadcast_id` bigint(20) DEFAULT NULL COMMENT '你好',
     `student_id` bigint(20) DEFAULT NULL COMMENT '学生ID',
     `content` varchar(1024) DEFAULT NULL COMMENT '学员内容',
     `comment` varchar(255) DEFAULT NULL COMMENT '注释',
     `gmt_create` datetime DEFAULT NULL,
     `gmt_modify` datetime DEFAULT NULL,
     PRIMARY KEY (`id`),
     KEY `activity_feedback_student_id_index` (`student_id`)
    ) ENGINE = InnoDB AUTO_INCREMENT = 1050 DEFAULT CHARSET = utf8mb4 COMMENT = '学员表'"""
  cur.execute(sql)
 def insert(self, id, inst_id, broadcast_id, student_id, content, comment, gmt_create, gmt_modify):
  sql = """INSERT INTO `activity_feedback` (
     `id`, `inst_id`, `broadcast_id`, `student_id`, `content`, `comment`, `gmt_create`, `gmt_modify`)
     VALUES ('{}','{}','{}','{}','{}','{}','{}','{}')""".format(id, inst_id, broadcast_id, student_id, content, comment, gmt_create, gmt_modify)
  try:
   self.connection()[1].execute(sql)
   self.connection()[0].commit()
  except:
   self.connection()[0].rollback()
if __name__ == '__main__':
 conn = Connection()
 conn.insert(123, 123, 324, 3451, 'ajdf', 'sdfs', '2013-2-5', '2014-3-4')

乍一看代码中似乎包含了commit(),为何数据库中始终没有数据?仔细检查后发现:


  try:
   self.connection()[1].execute(sql)
   self.connection()[0].commit()
  except:
   self.connection()[0].rollback()

connection()调用方法返回的对象是否为同一个?

并非如此。经过一番排查,发现是连接对象不一致导致的问题,经验尚浅。

正确写法:


  try:
   cons = self.connection()
   cons[1].execute(sql)
   cons[0].commit()
   cons[0].close()
  except:
   cons[0].rollback()

以上为个人经验总结,希望能为大家提供参考,也希望大家多多支持本站。如有错误或未考虑周全之处,敬请指正。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表