【问题标题】:What's the simplest way to access mssql with python or ironpython?使用 python 或 ironpython 访问 mssql 的最简单方法是什么?
【发布时间】:2010-09-22 08:14:56
【问题描述】:

我已经在我的个人计算机上运行了 mssql 2005,并带有一个我想在其上运行一些 python 脚本的数据库。我正在寻找一种方法来对数据进行一些非常简单的访问。我想运行一些选择语句,处理数据,也许让 python 保存一个包含结果的文本文件。

不幸的是,尽管我对 python 和数据库有所了解,但仅从阅读中我很难判断一个库是否符合我的要求。理想情况下,我想要一些适用于其他版本的 mssql、免费并获得许可以允许商业使用、易于使用并且可能与 Ironpython 一起使用的东西。

【问题讨论】:

    标签: python sql-server ironpython


    【解决方案1】:

    其他人似乎都覆盖了 cPython -> SQL Server 方面。如果你想使用 IronPython,你可以使用标准的 ADO.NET API 与数据库对话:

    import clr
    clr.AddReference('System.Data')
    from System.Data.SqlClient import SqlConnection, SqlParameter
    
    conn_string = 'data source=<machine>; initial catalog=<database>; trusted_connection=True'
    connection = SqlConnection(conn_string)
    connection.Open()
    command = connection.CreateCommand()
    command.CommandText = 'select id, name from people where group_id = @group_id'
    command.Parameters.Add(SqlParameter('group_id', 23))
    
    reader = command.ExecuteReader()
    while reader.Read():
        print reader['id'], reader['name']
    
    connection.Close()
    

    如果您已经拥有 IronPython,则无需安装其他任何东西。

    herehere 提供大量文档。

    【讨论】:

    • 这个例子似乎有点臃肿。
    • 不幸的是,ADO.NET 比相应的 Python DBAPI 代码要冗长一些(通常 .NET 类库也是如此)。但这并不算太糟糕,而且很容易包装在 DBAPI 模块中。我这样做是为了使用 SQLAlchemy。
    • 非常好,但不要忘记 SMO 是另一种选择。
    • (显然)可以让 SQLAlchemy 使用 IronPython stackoverflow.com/questions/2998558/…
    【解决方案2】:

    我将SQL Alchemy 与 cPython 一起使用(但我不知道它是否可以与 IronPython 一起使用)。如果您使用过 Hibernate/nHibernate,您会非常熟悉。如果这对您来说有点过于冗长,您可以使用Elixir,它是 SQL Alchemy 之上的一个薄层。要使用其中任何一个,您需要pyodbc,但这是一个非常简单的安装。

    当然,如果你想直接写SQL而不使用ORM,你只需要pyodbc。

    【讨论】:

      【解决方案3】:

      pyodbc 自带 Activestate Python,可以从here 下载。连接到 SQL Server 2005 数据库的最小 odbc 脚本如下所示:

      import odbc
      
      CONNECTION_STRING="""
      Driver={SQL Native Client};
      Server=[Insert Server Name Here];
      Database=[Insert DB Here];
      Trusted_Connection=yes;
      """
      
      db = odbc.odbc(CONNECTION_STRING)
      c = db.cursor()
      c.execute ('select foo from bar')
      rs = c.fetchall()
      for r in rs:
          print r[0]
      

      【讨论】:

      • 我是 Pyodbc 的忠实粉丝。它非常简单,易于与 sql server 和许多其他数据源一起使用。
      【解决方案4】:

      我还成功地将pymssql 与 CPython 一起使用。 (有和没有 SQLAlchemy)。

      【讨论】:

      • 作为记录,我相信 SQLAlchemy 中的 pymssql 支持已被弃用。推荐的驱动是 pyodbc(这并不是说 pymssql 不能独立工作)。
      【解决方案5】:

      http://adodbapi.sourceforge.net/ 可以与 CPython 或 IronPython 一起使用。我对此非常满意。

      【讨论】:

        【解决方案6】:

        PyPyODBC (http://code.google.com/p/pypyodbc) 在 PyPy、Ironpython 和 CPython 下工作。

        This article 展示了一个用 Python 访问 mssql 的 Hello World 示例。

        PyPyODBC 的用法与 pyodbc 几乎相同,因为它可以被视为 pyodbc moudle 的重新实现。因为它是用纯 Python 编写的,所以它也可以在 IronPython 和 PyPy 上运行。

        实际上,在现有脚本中切换到 pypyodbc 时,您可以这样做:

        #import pyodbc               <-- Comment out the original pyodbc importing line
        
        import pypyodbc as pyodbc    # Let pypyodbc "pretend" the pyodbc
        
        pyodbc.connect(...)          # pypyodbc has 99% same APIs as pyodbc
        
        ...
        

        【讨论】:

          【解决方案7】:

          我已经将pymssql 与标准python 一起使用并且喜欢它。如果您只是寻找基本的数据库访问权限,可能比提到的替代方案更容易。

          示例code

          【讨论】:

            【解决方案8】:

            如果您想要使用 CPython 的快速而肮脏的方式(也适用于 3.X python):

            安装python后安装PYWIN32http://sourceforge.net/projects/pywin32/files/pywin32/

            导入以下库: 导入odbc

            我创建了以下获取 SQL Server odbc 驱动程序的方法(根据您的 Windows 版本,命名略有不同,因此无论如何都会得到它):

            def getSQLServerDriver():
                key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\ODBC\ODBCINST.INI")
                sqlServerRegExp =  re.compile('sql.*server', re.I | re.S)
            
                try:
                    for i in range(0, 2048):
                        folder = winreg.EnumKey(key, i)
                        if sqlServerRegExp.match(folder):
                            return folder.strip()
                except WindowsError:
                    pass
            

            注意:如果您使用上述函数,您还需要导入这两个库:winreg 和 re

            然后您使用此处定义的 odbc API 1 信息:http://www.python.org/dev/peps/pep-0248/

            您的连接接口字符串应该如下所示(假设您使用我上面的方法来获取 ODBC 驱动程序名称,并且它是受信任的连接):

            dbString = "Driver={SQLDriver};Server=[SQL Server];Database=[Database Name];Trusted_Connection=yes;".replace('{SQLDriver}', '{' + getSQLServerDriver() + '}')
            

            这种方法有很多缺点。由于只支持 ODBC API 1,所以它很笨拙,而且我遇到的 API 或 ODBC 驱动程序中存在一些小错误,但它确实可以在 Windows 中的所有 CPython 版本中完成工作。

            【讨论】:

              猜你喜欢
              • 2010-11-17
              • 2016-10-23
              • 2015-06-08
              • 1970-01-01
              • 2011-06-20
              • 2010-12-07
              • 2012-02-05
              相关资源
              最近更新 更多