pymssql访问sqlserver的一个bug
对数据库进行多表操作,如果表与表之间存在依赖,那么显式的使用事务,可以保持对数据库操作的原子性。用Python访问SqlServer数据库,我使用pymssql库。今天在使用这个库的时候,发现一个问题。
问题大概是这样的:
我有两张表,一张主表(ClassInfo),一张从表(Student),Student表通过外键ClassID与ClassInfo表进行关联。这两张表的主键都是自增型的int型字段。
创建表的SQL语句如下:
CREATE TABLE ClassInfo(
ClassID INT IDENTITY(1, 1) PRIMARY KEY,
ClassName VARCHAR(20) NOT NULL
)
GO
CREATE TABLE Student(
StudentID INT IDENTITY(1, 1) PRIMARY KEY,
ClassID INT NOT NULL,
StudentName VARCHAR(20) NOT NULL,
FOREIGN KEY (ClassID) REFERENCES ClassInfo(ClassID)
)
GO
在代码中,先创建一个班级,然后在班级中插入学生数据。如果这两个操作在一个事务中完成,一般情况下,按照pymssql提供的文档,我们会写这样的语句来实现:
import pymssql
conn = pymssql.connect(host = 'JGood\\SQLEXPRESS', database = "Study",
user = "sa", password = "sa")
cur = conn.cursor()
#往主表中添加一条记录
cur.execute("INSERT INTO [ClassInfo] ([ClassName]) VALUES (%s)", 'jk0403')
#获取ID。
cur.execute("SELECT @@identity as ID")
classID = cur.fetchone()[0]
#往从表中添加记录
cur.execute("INSERT INTO [Student] (ClassID, StudentName) VALUES (%d, %s)",
(classID, 'JGood'))
conn.commit()
cur.close()
conn.close()
但是很遗憾,在运行代码的时候,出错了:
如果我把上面的操作分成两个独立的事务来实现,发现是没有问题的。
经过一下午地摸索,终算找到一个解决办法,就是把自增的ID以拼字符串的形式添加到SQL语句里,而不是以SQL参数的形式。
#往从表中添加记录
cur.execute("INSERT INTO [Student] (ClassID, StudentName) VALUES (" + str(classID) + ", %s)", ('JGood', ))
我不知道这算不算是pymssql的一个bug:在一个事务中,对于自动生成的外键值,不能以SQL参数的形式插入数据库。
相关文档:
Sqlserver中Compute By子句用法分析
2007年04月20日 星期五 08:05
使用Compute by子句和行统计函数(count,sum,max,avg,min等),可以统计排序中结果完全相同的列,统计值作为查询结果以附加行的形式显示,
语法:Compute avg|count|max|min|sum by 表达式
1、举一个例子
比如有一个数据表:表名为person,三个字段分别 ......
一。SqlServer自动作业备份
1、打开SQL Server Management Studio
2、启动SQL Server代理
3、点击作业->新建作业
4、"常规"中输入作业的名称
5、新建步骤,类型选T-SQL,在下面的命令中输入下面语句
DECLARE @strPath NVARCHAR(200)
set @strPath = convert(NVARCHAR(19),getdate(),120)
set @strPath=replace(@ ......
select
table_name=
(
case when t_c.column_id=1
then t_o.name
else ''
end
),
column_id=t_ ......
--TOP n 实现的通用分页存储过程(转自邹建)
CREATE PROC sp_PageView
@tbname sysname, --要分页显示的表名
@FieldKey nvarchar(1000), --用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段
@PageCurrent int=1, --要显示的页码
@PageSize int=10, - ......
· 本文讨论了如何通过Transact-SQL以及系统函数OPENDATASOURCE和OPENROWSET在同构和异构数据库之间进行数据的导入导出,并给出了详细的例子以供参考。
1. 在SQL Server数据库之间进行数据导入导出
(1).使用SELECT INTO导出数据
  ......