【问题标题】:python and pymssqlpython和pymssql
【发布时间】:2011-11-07 04:56:14
【问题描述】:

我是 python 新手。我正在尝试查询 MSSQL 数据库。


import pymssql
conn = pymssql.connect(host='hostname', user='username', password='password', database='dbname')
cursor = conn.cursor()
sql = "select count(*) from T_Email with (nolock) where Transmit is null"
cursor.execute(sql)
results = cursor.fetchall()
for row in results:
  print (row)

查询成功的是Microsoft SQL Server Management Studio,但是我的python脚本总是什么都不返回。

我确认我有网络连接。我验证了用户名、密码和数据库名称。如果我更改密码,那么脚本会出错。

我尝试过 results = cursor.fetchone(),但没有帮助。

有什么建议吗?

【问题讨论】:

  • 你能尝试打印结果对象并告诉输出是什么吗?
  • @Magd 我也遇到了同样的问题,你知道出了什么问题吗?

标签: python sql sql-server pymssql


【解决方案1】:

如果您使用的是 Ubuntu,您可能已经(像我一样)使用 apt-get 来安装 pymssql 包。

这是捆绑版本的一个已知错误:https://bugs.launchpad.net/ubuntu/+source/pymssql/+bug/918896

尝试使用 easy_install 手动安装。

【讨论】:

    【解决方案2】:

    我在 Ubuntu 12.04 上遇到了同样的问题,确实修复是按照以下顺序进行的:

    $ apt-get purge python-pymssql
    $ apt-get install freetds-dev
    $ pip install Cython
    $ pip install pymssql
    

    【讨论】:

      【解决方案3】:

      尝试将 conn.commit() 添加到您的查询中

      【讨论】:

      • 在execute和fetchall之间,确切地说;)
      • 即使我们只使用 pymssql 从数据库中读取,是否也需要这样做??
      • >>> conn.commit() >>> >>> results = cursor.fetchall() Traceback(最近一次调用最后):文件“”,第 1 行,在?文件“/usr/lib64/python2.4/site-packages/pymssql.py”,第 301 行,在 fetchall 中引发 OperationalError,“无可用数据。” pymssql.OperationalError:没有可用数据。 fetchone() 也不起作用
      • SELECT 查询不需要提交,提交只会让fetchall 引发 OperationalError
      【解决方案4】:

      如果没有足够的信息来重现该示例,很难说出您遇到的具体问题。但是,对于可能出现的问题,我有一些猜测:

      1. 可能您的实际列名(假设您上面的示例只是一个模型)太长了。请参阅:http://code.google.com/p/pymssql/wiki/FAQ(查找列名被静默截断为 30 个字符。(仅限 1.x))这是一个常见的错误,因为它静默失败!!
      2. 如果您在查询表之前创建表,或者其他需要提交的事情,即使启用了自动提交 (autocommit(1)),它也会搞砸。请参阅我对自己的回答:) pymssql ( python module ) unable to use temporary tables

      祝你好运!

      迈克

      【讨论】:

        【解决方案5】:
        import pymssql
        
        conn = pymssql.connect(
        server="server",
        port=port,
        user="user",
        password=password,
        database="database")
        conn
        
        cursor = conn.cursor()
        cursor.execute("select count(*) from T_Email with (nolock) where Transmit is null")
             for row in cursor.fetchall():  
             print ("%s\n" % str(row))
        conn.close()
        

        【讨论】:

          【解决方案6】:

          在你的代码 sn-p 中更改以下行

          results = cursor.fetchall()
          for row in results:
            print (row)
          

          进入

          # results = cursor.fetchall()
          for row in cursor:
            print (row)
          

          pymssql 在 cursor.fetchall()

          中有错误

          供参考https://github.com/pymssql/pymssql/issues/141

          【讨论】:

            猜你喜欢
            • 2016-01-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-03-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多