pyodbc连接MSSQL执行SQL语句
admin
2023-07-04 03:42:51
0

使用django连接SQL Server,如果要连接多个数据库,则使用pyodbc来连接。

pyodbc,运行查询的 SQL,非常简单:

import pyodbc

connection = pyodbc.connect('DRIVER={SQL Server Native Client 10.0};SERVER=127.0.0.1;DATABASE=DB_name;UID=User_Name;PWD=PassWord')
curs = connection.execute('select * from table')
#curs.fetchone()
curs.fetchall()

pyodbc的基本用法:

  1. 先导入:from pyodbc import connect;

  2. 产生连接实例:Conn = connect(DBCONNECTSTR);

  3. 产生游标:cur = Conn.cursor();

  4. 执行游标命令:cur.execute()、cur.commit()、cur.rollback()之类;

  5. 关闭游标:cur.close();

  6. 关闭连接实例:Conn.close()。

以上6个步骤都是必要的。

如果仅仅是查询,可以直接使用实例直接运行excute命令就可以了,可以不创建游标,那么3、4、5步都可以省略。

上面这些内容网上一大堆教程,我就不多说了。(DRY=Donot Repeat Yourself)

不过网上很多文章都是误导,例如:Python连接数据库-pyodbc

里面说运行存储过程使用 callproc() 方法。

提供 connection 和 cursor 的方法列表:


>>> dir(Conn)

['__class__', '__delattr__', '__doc__', '__enter__', '__exit__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'add_output_converter', 'autocommit', 'clear_output_converters', 'close', 'commit', 'cursor', 'execute', 'getinfo',  'rollback', 'searchescape', 'timeout']

>>> dir(cur)

['__class__', '__delattr__', '__doc__', '__enter__', '__exit__', '__format__', '__getattribute__', '__hash__', '__init__', '__iter__', '__new__', '__reduce__','__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'arraysize', 'close', 'columns', 'commit', 'connection',  'description', 'execute',  'executemany', 'fetchall', 'fetchmany', 'fetchone', 'foreignKeys', 'getTypeInfo', 'next', 'nextset', 'noscan', 'primaryKeys', 'procedureColumns', 'procedures', 'rollback', 'rowIdColumns', 'rowVerColumns',  'rowcount', 'setinputsizes', 'setoutputsize', 'skip', 'statistics', 'tables']

执行存储过程还是使用execute()方法,然后附加 EXEC 当作SQL命令来执行。


try:
    #如果没有返回数据,存储过程执行方法
    cur.execute('EXEC P_PROCDUREName param1,param2,%d,%s' %(p1_int,p2_str))
    print cur.rowcount  #可以得到存储过程影响的行数
    #如果有返回数据集,需要添加 set nocount on, 也可在存储过程中就加入
    rows = cur.execute('SET NOCOUNT ON; EXEC P_PROCDUREName param1,param2,%d,%s' %(p1_int,p2_str)).fetchall()
    print cur.rowcount,rows   #聪明的你已经知道,行数肯定是没有的(-1),后面的rows是一个列表,看你的数据是咋样的了。
    #无论何种方式,都可以最后才commit(其实方式2已经默认包含了commit)
    cur.commit()
except Exception as e:
    print e

注意:如果需要得到返回数据(即存储过程里面有 Select出来的内容),就需要加上SET NOCOUNT ON;参数,否则可能会出现错误:No Results,Previous SQL was not a query

相关内容

热门资讯

日本要搞两个首都? 日本媒体日前报道,日本维新会正在推进将大阪设为“副首都”的构想,定于6月中旬组建一个专门小组。对此,...
稳舵扬帆正当时——5月全国各地... 原标题:稳中求进每月看|稳舵扬帆正当时——5月全国各地经济社会发展观察从多地以法治之力护航民营经济高...
燃气灶打火一会就灭是什么原因呢 原因是1、燃气灶过压保护,可以通过增加减压阀来解决这个问题。2、可能是因为燃气灶电池没有电了,可以将...
燃气开的燃气灶打不了火什么原因 可能是燃气灶电池电量不足。可能是燃气通路不畅通,如果火花声音清脆有力,但是点不着火。可能是燃气灶老化...
好太太燃气灶有电有气打不 这种情况原因有很多种,1、可能的原因就是我们的燃气灶进入了过压保护,我们家中使用的很多燃气灶都有过压...
燃气灶打火就是不着咋办 燃气灶是我们日常生活中经常使用的家用电器,但有时候我们会遇到燃气灶打火不着的情况,让人十分苦恼。那我...
燃气灶光打火没有气进来怎么回事 原因是燃气灶电池没有电了,可以将燃气灶的电池盒拆下来更换一个新的一号电池;还有可能是燃气灶的线路接触...
内蒙古包头:首批投运1000辆... 新华社5月31日消息,近日,我国自主研发的氢能两轮车在内蒙古自治区包头市面向公众投入运营,首批将在公...
缅甸边境发生爆炸,云南群众目击... 5月31日,缅甸掸邦北部南坎镇发生一起爆炸事故,已导致多人伤亡,多处民宅、房屋遭到严重损毁。经初步调...
大湾区打出智造新名片,高域首台... 近日,在广州黄埔区的智能制造产业园内,一架白色多旋翼飞行器缓缓驶出生产线,标志着高域(GOVY)这家...