代码之家  ›  专栏  ›  技术社区  ›  oneself

cx_Oracle和数据源范例

  •  3
  • oneself  · 技术社区  · 15 年前

    在Java中实现了数据库访问的Java范例 DataSource . 该对象围绕数据库连接的创建创建有用的抽象。这个 数据来源 对象保留数据库配置,但仅在请求时创建数据库连接。这允许您将所有数据库配置和初始化代码保存在一个地方,并使更改数据库实现或使用模拟数据库进行测试变得容易。

    import cx_Oracle as dbapi
    connection = dbapi.connect(connection_string)
    # At this point I am assuming that a real connection has been made to the database.
    # Is this true?
    

    我正试图找到一个类似于 数据来源 在甲骨文中。我可以通过创建一个新类并包装cx_Oracle来轻松创建它,但我想知道这是否是在Python中实现它的正确方法。

    4 回复  |  直到 8 年前
        1
  •  3
  •   Vinay Sajip    15 年前

    通过查看以下内容,您将找到如何在Python中访问数据库的相关信息 PEP-249: Python Database API Specification v2.0 . cx_Oracle 与Python的许多数据库驱动程序一样,符合此规范。

    在本规范中 Connection 对象表示数据库连接,但没有内置池。工具,例如 SQLAlchemy 确实提供了池功能,尽管SQLAlchemy通常被称为ORM,但它不必这样使用,并且提供了很好的抽象,可以在SQL引擎之上使用。

    如果您确实想做对象关系映射,那么SqLalCyMy执行该业务,您可以考虑它自己的声明性语法或其他层,例如 Elixir 它位于SQLAlchemy之上,为更常见的用例提供了更高的易用性。

        2
  •  1
  •   Epcylon    15 年前

    我不认为在Python中有一种“正确”的方法可以做到这一点,除了可能更进一步,在您和数据库之间使用另一层。

    根据希望使用DataSource概念的原因(我只在Java中遇到过),SQLAlchemy(或类似的东西)可以为您解决问题,而无需从头开始编写。

    如果这不符合要求,那么编写自己的包装听起来是一个合理的解决方案。

        3
  •  0
  •   Mark Harrison    15 年前

    是的,Python有类似的抽象。

    这来自我们的本地构建回归测试,在这里,我们保证无论何时构建一个新的python,我们都可以与所有的数据库进行对话。

    if database == SYBASE:
        import Sybase
        conn = Sybase.connect('sybasetestdb','mh','secret')
    elif database == POSTRESQL:
        import pgdb
        conn = pgdb.connect('pgtestdb:mh:secret')
    elif database == ORACLE:
        import cx_Oracle
        conn = cx_Oracle.connect("mh/secret@oracletestdb")
    
    curs=conn.cursor()
    curs.execute('select a,b from testtable')
    for row in curs.fetchall():
        print row
    

    (注意,这是一个简单的版本,在我们的multidb-aware代码中,我们有一个dbconnection类,其中包含此逻辑。)

        4
  •  0
  •   Greg Ricardo Gellman    15 年前