精华内容
下载资源
问答
  • pymssql

    2018-08-28 11:48:00
    用与连接sql server数据库的python接口...import pymssql 1.配置信息 conf={ "host": "118.190.41.846:9099", "user": "sa", "password": "123", "database": "water"} 如果是连接本地的数据库,host可以...

    用与连接sql server数据库的python接口

    import pymssql

    1.配置信息

    conf={

            "host": "118.190.41.846:9099",

            "user": "sa",

            "password": "123",

            "database": "water"} 

    如果是连接本地的数据库,host可以写为本机的数据库名例‘DESKTOP-K06BHO8’

     

    2.连接数据库

    conn=pymssql.connect(**conf)

    cur=conn.cursor()   #默认返回元组,使用as_dict='True'设置为返回字典形式的列表

    #用with功能,避免忘记关闭连接与游标

    # with pymssql.connect(**config["test2"]) as conn:

    #     with conn.cursor(as_dict=True) as cursor:

    #         cursor.execute('SELECT top 10 * FROM tbluserinfo WHERE userid=%s', 'John Doe')

    #         #通过迭代方式获取查询结果

    #         for row in cursor:

    #             print("ID=%d, Name=%s" % (row['id'], row['name']))

    # conn.commit()

    3.执行sql语句

    sql='select * from readdata'

    cur.execute(sql)

    execute('insert into test3(username,address,type) values(%s,%s,%d)',('wingwed','3 street 4 block',3))

    该方法有两个参数,可在sql语句中使用入参,字符型用%s,数字型用%d,

    第二个参数必须是元组或dict类型,列表类型会报错。

    也可一次写入多条记录

    executemany("INSERT INTO persons VALUES (%d, %s, %s)",

        [(1, 'John Smith', 'John Doe'),

        (2, 'Jane Doe', 'Joe Dog'),

        (3, 'Mike T.', 'Sarah H.')])

    4.获取执行结果

    data=cur.fetchall()#获取所有结果,返回每条记录元组组成的列表

    #data=cur.fetchone() 获取一条结果,返回单个元组,当查询结果记录数为0时,不会报错,会返回None.

    #通过迭代方式获取查询结果

    #         for row in cur:

    #             print("ID=%d, Name=%s" % (row['id'], row['name']))

     

    #5.调用存储过程

     # with conn.cursor(as_dict=True) as cursor:

     #        cursor.execute("""

     #        CREATE PROCEDURE FindPerson

     #            @name VARCHAR(100)

     #        AS BEGIN

     #            SELECT * FROM persons WHERE name = @name

     #        END

     #        """)

     #        cursor.callproc('FindPerson', ('Jane Doe',))

     #        for row in cursor:

     #            print("ID=%d, Name=%s" % (row['id'], row['name']))

     

    转载于:https://www.cnblogs.com/Ting-light/p/9547265.html

    展开全文
  • python pymssqlpymssql模块使用指南

    万次阅读 多人点赞 2018-09-28 12:58:32
    最近在学习python,发现好像没有对pymssql的详细说明,于是乎把官方文档学习一遍,重要部分做个归档,方便以后查阅。 本文介绍了pymssql模块的主要使用。

    前言

    最近在学习python,发现好像没有对pymssql的详细说明,于是乎把官方文档学习一遍,重要部分做个归档,方便自己以后查阅。

    pymssql是python用来连接Microsoft SQL Server的一个工具库(package)。其包含两个模块:

    • pymssql:遵从DB-API1规范的接口
    • _mssql:性能更佳、更易于使用

    从版本2.1.x起,整个库的实现基于FreeTDS2的db-lib组件。

    pymssql的架构如下:
    pymssql架构

    在Windows下的安装很简单,下载安装个相对新版的python,具体来说:

    • Python 2.x: 2.7以上
    • Python 3.x: 3.3以上

    然后打开命令行:

    pip install pymssql
    

    然后就自动安装上了,好像FreeTDS之后的支持库都会自动帮忙安好。

    另外注意为了后面的使用,需要自己安装好Microsoft SQL Server,2005以上的版本。

    pymssql模块使用

    以下示例程序基于官方的示例,并进行了一定的修改,主要是删改了些代码以及添加了很多注释。

    基本使用流程

    pymssql的使用十分简单,基本就如下几个步骤

    1. 创建链接:使用connect()创建连接并获取Connection对象
    2. 交互操作:获取Connection对象的Cursor对象,然后使用Cursor对象的各种方法与数据库进行交互
    3. 关闭链接

    本章假设你已经配置好环境并且在本地数据库中有一个叫tempdb的数据库,有一个用户的用户名为sa,密码为123456。
    以下程序简单示例了上述步骤并创建好了测试用数据库。

    import pymssql
    #sql服务器名,这里(127.0.0.1)是本地数据库IP
    serverName = '127.0.0.1'
    #登陆用户名和密码
    userName = 'sa'
    passWord = '123456'
    #建立连接并获取cursor
    conn = pymssql.connect(serverName , userName , passWord, "tempdb")
    cursor = conn.cursor()
    # 创建测试表 persons,包含字段:ID、name、salesrep
    cursor.execute("""
    IF OBJECT_ID('persons', 'U') IS NOT NULL
        DROP TABLE persons
    CREATE TABLE persons (
        id INT NOT NULL,
        name VARCHAR(100),
        salesrep VARCHAR(100),
        PRIMARY KEY(id)
    )
    """)
    # 插入三条测试数据
    cursor.executemany(
        "INSERT INTO persons VALUES (%d, %s, %s)",
        [(1, 'John Smith', 'John Doe'),
         (2, 'Jane Doe', 'Joe Dog'),
         (3, 'Mike T.', 'Sarah H.')])
    # 如果连接时没有设置autocommit为True的话,必须主动调用commit() 来保存更改。
    conn.commit()
    # 查询记录
    cursor.execute('SELECT * FROM persons WHERE salesrep=%s', 'John Doe')
    # 获取一条记录
    row = cursor.fetchone()
    # 循环打印记录(这里只有一条,所以只打印出一条)
    while row:
        print("ID=%d, Name=%s" % (row[0], row[1]))
        row = cursor.fetchone()
    # 连接用完后记得关闭以释放资源
    conn.close()
    

    后面较为详细的分开讲解下各个步骤

    创建连接

    因为这篇文章讲的是pymssql模块(如上所述还有一个_mssql模块)所以要import pymssql。

    为了创建连接,需要调用pymssql.connect()方法,这个方法会返回一个Connection对象。

    用户验证登陆

    可能比较常用的就是如上面程序中所用的用户名+密码的登陆方式了:

    conn = pymssql.connect(serverName , userName , passWord, "tempdb")
    

    等价于:

    conn = pymssql.connect(server = serverName , user = userName , password = passWord, database = "tempdb")
    

    第二种用关键字的方式可以按任意顺序传递各参数(好吧,这其实是python的基础知识)。

    Windows身份认证登陆

    登陆自己电脑上的数据库时,Windows身份认证的方式登陆是个很好用的方法。因为不需要账号密码:

    conn = pymssql.connect(server = serverName , database = "tempdb")
    

    简单来说,只要不填账号密码,就会自动用Windows身份认证的方式来登陆了。

    其他几个常用选项

    • database(str):指定的是默认数据库,如果不需要的话,上述例子中其实可以不写。但是这样的话,那你的SQL语句中就得在最前面加上"USE tempdb ……"了,sql server用的多的应该知道怎么回事。
    • as_dict(bool) :如果设置为True,则后面的查询结果返回的是字典,关键字为查询结果的列名;否则(默认)返回的为list。
    • autocommit(bool):默认为False,这样如果对数据表进行更改,则需要手动调用commit来提交操作。
    • port(str):指定服务器的TCP端口,如果你没有改过的话使用默认的就好。

    其他选项详见文档。

    交互操作

    在连接建立成功后,与数据库的交互主要是通过Cursor对象进行的:

    cursor = conn.cursor()
    

    提交sql命令

    如上示例,sql指令通过execute系列方法来执行:

    cursor.execute('sql语句')
    

    调用存储过程

    如果要调用存储过程,则使用Cursor对象的callproc方法

    # 创建一个存储过程
    cursor.execute("""
    CREATE PROCEDURE FindPerson
         @name VARCHAR(100)
     AS BEGIN
         SELECT * FROM persons WHERE name = @name
    END
    """)
    # 调用上面的存储过程
    cursor.callproc('FindPerson', ('Jane Doe',))
    

    提交修改

    如果对数据进行了修改,且在连接时没有把autocommit设置为True,则需要手动调用commit进行提交修改。

    conn.commit()
    

    获取结果

    如果执行的是有返回值的sql语句,则可以通过Cursor对象的fetch系列方法来获取结果,结果默认为元组类型:

    # 查询persons表中记录数
    cursor.execute("SELECT COUNT(*) FROM persons")
    # 结果为3
    cnt = cursor.fetchone()[0]
    

    如果返回多条记录,可以像这样遍历所有结果:

    cursor.execute('SELECT * FROM persons')
    # 遍历输出persons表中所有数据
    row = cursor.fetchone()
    while row:
        print("ID=%d, Name=%s" % (row[0], row[1]))
        row = cursor.fetchone()
    

    或者:

    # 这里写sql语句的和上例不完全一样只是为了示例execute的其他用法
    cursor.execute('SELECT * FROM persons WHERE salesrep=%s', 'John Doe')
    for row in cursor:
        print('row = %r' % (row,))
    

    如果指定了as_dict为True,则返回结果变为字典类型,这样就能通过列名来访问结果了:

    # 除了在建立连接时指定,还可以在这里指定as_dict=True
    cursor = conn.cursor(as_dict=True)
    
    cursor.execute('SELECT * FROM persons')
    for row in cursor:
        print("ID=%d, Name=%s" % (row['id'], row['name']))
    

    另外,还可以使用fetchmany和fetchall来一次性获取指定数量或者所有的结果。

    Cursor对象注意事项

    一条链接在任何时候只会有一个Cursor对象处于查询状态,这是因为底层的TDS协议没有客户端侧的Cursor,协议要求客户端在进行下一次查询前先完成上一次的。因此如果你想同时在一个连接上进行两个查询的话可能会出现各种惊喜,也许在使用多线程等方式的时候需要特别注意这点:

    c1 = conn.cursor()
    c1.execute('SELECT * FROM persons')
    
    c2 = conn.cursor()
    c2.execute('SELECT * FROM persons WHERE salesrep=%s', 'John Doe')
    
    print( "all persons" )
    print( c1.fetchall() )  # 展示的是 c2 的结果!
    
    print( "John Doe" )
    print( c2.fetchall() )  # 没有任何结果,因为已经被上一条输出了
    

    有两种解决方案:

    • 另外建一条链接,每条链接都能有一个进行中的查询,因此这样就可以有多个查询同步进行了。
    • 进行下一次查询前先使用fetchall获取上一次的所有结果:
    c1.execute('SELECT ...')
    c1_list = c1.fetchall()
    
    c2.execute('SELECT ...')
    c2_list = c2.fetchall()
    

    关闭链接

    操作完成后应该调用close方法来关闭链接并释放资源:

    conn.close()
    

    可以使用with语句来处理Connection和cursor对象,这样就不需要手动关闭他们了:

    with pymssql.connect(server, user, password, "tempdb") as conn:
        with conn.cursor(as_dict=True) as cursor:
            cursor.execute('SELECT * FROM persons WHERE salesrep=%s', 'John Doe')
            for row in cursor:
                print("ID=%d, Name=%s" % (row['id'], row['name']))
    

    文档

    如果想要更加详细了解这个模块的话,请移步:
    https://blog.csdn.net/lin_strong/article/details/82880806

    参考文献

    [1] http://www.pymssql.org/en/stable/intro.html


    1. Python DB-API 是一个规范,它定义了一系列必须的对象和数据库存取方式,以便为各种各样的底层数据库系统和多种多样的数据库接口程序提供一致的访问接口。 ↩︎

    2. FreeTDS是一个程序库,其实现了在Windows、Unix和Linux系统下访问Microsoft SQL Server和Sybase数据库,是TDS(表列数据流 )协议的一个开源实现。 ↩︎

    展开全文
  • Python pymssql

    2021-06-25 00:51:07
    pymssql._pymssql.ProgrammingError: (102, b"Incorrect syntax near '!'.DB-Lib error message 20018, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\n") 主要问题是这个near!第一...
  • Pthon Pymssql

    2014-11-05 12:19:32
    Pthon Pymssql32位,安装成功,好用,python2.7以上
  • pymssql, pymssql源代码的官方主页 SQL Server 的 pymssql接口 为 python 建立一个简单的数据库接口,在 FreeTDS之上,为微软 SQL Server 提供一个 python db api接口。有关pymssql的详细信息可以在网
  • pymssql-Microsoft SQL Server的DB-API接口 一个简单的数据库接口,它建立在之上,为提供Python DB-API( )接口。 有关pymssql的详细信息,请访问以下网站: GitHub上发生了新的发展: 有一个Google网上论坛供...
  • pymssql examples

    2019-01-08 06:37:38
    http://pymssql.org/en/latest/pymssql_examples.html Example scripts using pymssql module. Basic features (strict DB-API compliance) from os import getenv import pymssql server = ...

    http://pymssql.org/en/latest/pymssql_examples.html

    Example scripts using pymssql module.

    Basic features (strict DB-API compliance)

    from os import getenv
    import pymssql
    
    server = getenv("PYMSSQL_TEST_SERVER")
    user = getenv("PYMSSQL_TEST_USERNAME")
    password = getenv("PYMSSQL_TEST_PASSWORD")
    
    conn = pymssql.connect(server, user, password, "tempdb")
    cursor = conn.cursor()
    cursor.execute("""
    IF OBJECT_ID('persons', 'U') IS NOT NULL
        DROP TABLE persons
    CREATE TABLE persons (
        id INT NOT NULL,
        name VARCHAR(100),
        salesrep VARCHAR(100),
        PRIMARY KEY(id)
    )
    """)
    cursor.executemany(
        "INSERT INTO persons VALUES (%d, %s, %s)",
        [(1, 'John Smith', 'John Doe'),
         (2, 'Jane Doe', 'Joe Dog'),
         (3, 'Mike T.', 'Sarah H.')])
    # you must call commit() to persist your data if you don't set autocommit to True
    conn.commit()
    
    cursor.execute('SELECT * FROM persons WHERE salesrep=%s', 'John Doe')
    row = cursor.fetchone()
    while row:
        print("ID=%d, Name=%s" % (row[0], row[1]))
        row = cursor.fetchone()
    
    conn.close()
    

    Connecting using Windows Authentication

    When connecting using Windows Authentication, this is how to combine the database’s hostname and instance name, and the Active Directory/Windows Domain name and the username. This example uses raw strings (r'...') for the strings that contain a backslash.

    conn = pymssql.connect(
        host=r'dbhostname\myinstance',
        user=r'companydomain\username',
        password=PASSWORD,
        database='DatabaseOfInterest'
    )
    

    Iterating through results

    You can also use iterators instead of while loop.

    conn = pymssql.connect(server, user, password, "tempdb")
    cursor = conn.cursor()
    cursor.execute('SELECT * FROM persons WHERE salesrep=%s', 'John Doe')
    
    for row in cursor:
        print('row = %r' % (row,))
    
    conn.close()
    

    Note

    Iterators are a pymssql extension to the DB-API.

    Important note about Cursors

    A connection can have only one cursor with an active query at any time. If you have used other Python DBAPI databases, this can lead to surprising results:

    c1 = conn.cursor()
    c1.execute('SELECT * FROM persons')
    
    c2 = conn.cursor()
    c2.execute('SELECT * FROM persons WHERE salesrep=%s', 'John Doe')
    
    print( "all persons" )
    print( c1.fetchall() )  # shows result from c2 query!
    
    print( "John Doe" )
    print( c2.fetchall() )  # shows no results at all!
    

    In this example, the result printed after "all persons" will be the result of the second query (the list where salesrep='John Doe') and the result printed after “John Doe” will be empty. This happens because the underlying TDS protocol does not have client side cursors. The protocol requires that the client flush the results from the first query before it can begin another query.

    (Of course, this is a contrived example, intended to demonstrate the failure mode. Actual use cases that follow this pattern are usually much more complicated.)

    Here are two reasonable workarounds to this:

    • Create a second connection. Each connection can have a query in progress, so multiple connections can execute multiple conccurent queries.

    • use the fetchall() method of the cursor to recover all the results before beginning another query:

      c1.execute('SELECT ...')
      c1_list = c1.fetchall()
      
      c2.execute('SELECT ...')
      c2_list = c2.fetchall()
      
      # use c1_list and c2_list here instead of fetching individually from
      # c1 and c2
      

    Rows as dictionaries

    Rows can be fetched as dictionaries instead of tuples. This allows for accessing columns by name instead of index. Note the as_dict argument.

    conn = pymssql.connect(server, user, password, "tempdb")
    cursor = conn.cursor(as_dict=True)
    
    cursor.execute('SELECT * FROM persons WHERE salesrep=%s', 'John Doe')
    for row in cursor:
        print("ID=%d, Name=%s" % (row['id'], row['name']))
    
    conn.close()
    

    Note

    The as_dict parameter to cursor() is a pymssql extension to the DB-API.

    Using the with statement (context managers)

    You can use Python’s with statement with connections and cursors. This frees you from having to explicitly close cursors and connections.

    with pymssql.connect(server, user, password, "tempdb") as conn:
        with conn.cursor(as_dict=True) as cursor:
            cursor.execute('SELECT * FROM persons WHERE salesrep=%s', 'John Doe')
            for row in cursor:
                print("ID=%d, Name=%s" % (row['id'], row['name']))
    

    Note

    The context manager personality of connections and cursor is a pymssql extension to the DB-API.

    Calling stored procedures

    As of pymssql 2.0.0 stored procedures can be called using the rpc interface of db-lib.

    with pymssql.connect(server, user, password, "tempdb") as conn:
        with conn.cursor(as_dict=True) as cursor:
            cursor.execute("""
            CREATE PROCEDURE FindPerson
                @name VARCHAR(100)
            AS BEGIN
                SELECT * FROM persons WHERE name = @name
            END
            """)
            cursor.callproc('FindPerson', ('Jane Doe',))
            for row in cursor:
                print("ID=%d, Name=%s" % (row['id'], row['name']))
    

    Using pymssql with cooperative multi-tasking systems

    New in version 2.1.0.

    You can use the pymssql.set_wait_callback() function to install a callback function you should write yourself.

    This callback can yield to another greenlet, coroutine, etc. For example, for gevent, you could use itsgevent.socket.wait_read() function:

    import gevent.socket
    import pymssql
    
    def wait_callback(read_fileno):
        gevent.socket.wait_read(read_fileno)
    
    pymssql.set_wait_callback(wait_callback)
    

    The above is useful if you’re say, running a Gunicorn server with the gevent worker. With this callback in place, when you send a query to SQL server and are waiting for a response, you can yield to other greenlets and process other requests. This is super useful when you have high concurrency and/or slow database queries and lets you use less Gunicorn worker processes and still handle high concurrency.

    Note

    set_wait_callback() is a pymssql extension to the DB-API 2.0.

     

    展开全文
  • pymssql用法

    2019-09-05 11:24:18
    pymssql用法 conn是连接数据库后的hand cursor是hand的游标 ,用于提交数据库的查询等信息 连接数据库 conn=pymssql.connect(host="127.0.0.1", #连接数据库 user="sa", password="123", ...

    pymssql用法

    因为CSDN博客设置私密就不会再博客分类内看到,所以这篇文章只能设为公开的了。

    conn是连接数据库后的hand

    cursor是hand的游标 ,用于提交数据库的查询等信息

    连接数据库

        conn=pymssql.connect(host="127.0.0.1", #连接数据库
                             user="sa",
                             password="123",
                             database="stuManage",
                             charset="utf8")
    

    执行查询语句并获得结果

    sql="select * from course"
    cursor.execute(sql)#执行sql语句
    rs=cursor.fetchall()#取结果
    

    执行其他sql语句

    sql=''' drop table dch
            ''' 
    cursor.execute(sql)
    conn.commit()#提交创建信息
    

    捕捉操作

    try:
    	createTable(cursor)# 创建表dch
    	# conn.commit()#提交创建信息
    except pymssql.OperationalError as e :#捕捉操作异常
    	print(e)
    #捕捉所有异常
    except Exception as e:
        print(e)
    

    用表格打印查询结果

    sql="select * from course"
    cursor.execute(sql)#执行sql语句
    table=from_db_cursor(cursor)#直接使用PrettyTable的成员函数即可
    print(table)
    
    
    #也可以这样
    table=PrettyTable(["课程号","课程名称","学号"])
    rs=cursor.fetchall()#取结果
    for i in rs:
        table.add_row(i)
    

    类的静态成员变量和类成员函数

    class dch:
        dch_name=""  #这是类属性
    	@classmethod
        def query(self):
            print("this class methon")
            
    

    获取当前时间

    import datetime
    print(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
    #输出:2019-06-02 23:24:22
    

    获取两时间之间有多少天

    ans=(datetime.datetime(2020,1,13,12,0,0) - datetime.datetime(2019,1,13,12,0,0)).total_seconds()/(24*60*60)
    # 输出:365.0
    
    展开全文
  • PyCharm安装pymssql

    千次阅读 2020-04-04 21:29:58
    最近要使用python,在安装数据库包的时候报错了,通过PyCharm自己安装有各种各样的错误,后来改了一种方式才能安装,这次又要安装pandas,记录一下,和安装pymssql一样,在安装的时候报了错 上边这个还没有...
  • pymssql文档

    2019-09-27 23:06:11
    pymssql methods set_max_connections(number)-- Sets maximum number of simultaneous database connections allowed to be open at any given time. Default is 25. get_max_connections()-- Gets ...
  • mac 安装pymssql

    2020-07-08 15:58:33
    我们在mac环境下想连接mssqlserver数据库,首先要考虑的就是使用pymssql库,而pymssql是在freedts的基础上研发的,所以要先安装freedts,但是安装这个库之前还需有有一系列的支撑库 brew installunixodbc pip ...
  • Python安装pymssql

    万次阅读 多人点赞 2016-09-03 12:19:39
    Python安装pymssql (v2.1.3)pymssql下载地址: https://pypi.python.org/pypi/pymssql/python2.7 x32版本下pymssql的安装:如果使用2.1.1版本:https://pypi.python.org/pypi/pymssql/2.1.1#downloads,下载时选择...
  • python2.5 pymssql

    2012-05-01 20:53:40
    python2.5 pymssql插件
  • 本文实例讲述了pymssql数据库操作MSSQL2005的方法。分享给大家供大家参考。具体如下: 使用的MSSQL2005,通过pymssql来连接的。把可能用到的数据库操作方式都总结如下,如果要用的时候就备查啦。 #!/usr/bin/env ...
  • pymssql-2.1.0.zip

    2019-11-05 17:20:00
    python2.7连接sqlserver库使用到的模块,pymssql-2.1.0需要编译才能使用,正文有编译方法。
  • Python的pymssql和twisted

    2019-11-27 11:32:49
    pymssql-2.1.3-cp36-cp36m-win_amd64.whl 和Twisted-19.10.0-cp36-cp36m-win_amd64.whl
  • pymssql连接mssql

    2020-09-12 15:28:43
    pymssql连接mssql 环境 Win10 Python 3.7.4 conda 4.7.12 pymssql==2.1.4 pip安装 pip install pymssql 在数据库中建表并插入数据的SQL语句 create table animal( id int not null, name char(20) ) insert into...
  • pymssql 2.1.4 windows系统 64位,python 3.7.4版本 import pymssql DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it ...
  • Py之pymssql:Python库之pymssql的简介、安装、使用方法之详细攻略 目录 pymssql的简介 1、特点 pymssql的安装 pymssql的使用方法 1、过程备注 pymssql的简介 一个简单的Python数据库接口,它建立...
  • 主要介绍了如何处理Python3.4 使用pymssql 乱码问题的相关资料,涉及到python pymssql相关知识,对此感兴趣的朋友一起学习吧
  • pymssql
  • pymssql连接SQLServer

    2020-01-09 09:02:26
    import pymssql from collections.abc import Iterable class MSSQL(object): ''' 对pymssql的简单封装 pymssql库,该库到这里下载:http://www.lfd.uci.edu/~gohlke/pythonlibs/#pymssql 使用该库时...
  • python pymssql - pymssql模块官方文档的翻译

    千次阅读 多人点赞 2018-09-28 12:45:22
    此为pymssql模块version2.1.4官方文档的翻译,仅供学习交流使用,请勿用于商业用途。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,084
精华内容 1,633
关键字:

pymssql