Python向PostgreSQL插入NULL值及常见提交陷阱解析
本文探讨在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()
以上为个人经验总结,希望能为大家提供参考,也希望大家多多支持本站。如有错误或未考虑周全之处,敬请指正。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













