十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
使用django连接SQL Server,如果要连接多个数据库,则使用pyodbc来连接。
创新互联-专业网站定制、快速模板网站建设、高性价比安平网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式安平网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖安平地区。费用合理售后完善,十余年实体公司更值得信赖。
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的基本用法:
先导入:from pyodbc import connect;
产生连接实例:Conn = connect(DBCONNECTSTR);
产生游标:cur = Conn.cursor();
执行游标命令:cur.execute()、cur.commit()、cur.rollback()之类;
关闭游标:cur.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