对数据库进行多表操作,如果表与表之间存在依赖,那么显式的使用事务,可以保持对数据库操作的原子性。用Python访问SqlServer数据库,我使用pymssql库。今天在使用这个库的时候,发现一个问题。
问题大概是这样的:
我有两张表,一张主表(ClassInfo),一张从表(Student),Student表通过外键ClassID与ClassInfo表进行关联。这两张表的主键都是自增型的int型字段。
创建表的SQL语句如下:
在代码中,先创建一个班级,然后在班级中插入学生数据。如果这两个操作在一个事务中完成,一般情况下,按照pymssql提供的文档,我们会写这样的语句来实现:
但是很遗憾,在运行代码的时候,出错了:
如果我把上面的操作分成两个独立的事务来实现,发现是没有问题的。
经过一下午地摸索,终算找到一个解决办法,就是把自增的ID以拼字符串的形式添加到SQL语句里,而不是以SQL参数的形式。
我不知道这算不算是pymssql的一个bug:在一个事务中,对于自动生成的外键值,不能以SQL参数的形式插入数据库。