MySQLdb Python - 测试数据库

时间:2013-09-23 21:52:28

标签: python mysql import

我想对使用MySQL数据库的代码运行一些测试。现在,代码由多个模块组成,这些模块都导入了一个公共模块mainlib

这个模块
db = MySQLdb.connect(host='localhost', user='admin', password='admin', db='MyDatabase'). 

我想使用测试数据库而不是真实数据库进行测试。

我想我可以关闭连接(mainlib.db.close())并在测试脚本中创建一个新连接:

db = MySQLdb.connect(host='localhost', user='admin', password='admin', db='TestDatabase')

并使用相同的全局变量命名新游标。但我不确定其他模块中的导入是如何工作的。在任何情况下,这个方法似乎都不起作用,因为我得到InterfaceError: (0, '')以及我的测试数据库cursor没有数据。

有没有人知道如何在不修改源代码的情况下切换到测试数据库?

2 个答案:

答案 0 :(得分:1)

Python的“全局”变量没有全局范围。它们是模块范围变量。因此,不同模块中同名的全局变量不是同一个变量。

我认为您可能正在关闭mainlib.db,然后将mytestcode.db设置为新数据库。您的所有其余代码当然会继续使用mainlib.db,现在已关闭。

尝试mainlib.db = MySQLdb.connect(...),光标也一样。直接修改另一个模块的变量很难看,但它可以按照您的预期工作。

另一种方法是介绍一种配置mainlib如何打开数据库的方法。例如,您可以在mainlib

中使用这样的函数
db = None
dbname = None
cursor = None

def connectdb(name = None):
    """
    Set up the global database connection and cursor, if it isn't already.

    Omit 'name' when the caller doesn't care what database is used,
    and is happy to accept whatever database is already connected or
    connect to a default database.

    Since there cannot be multiple global databases, an exception is thrown
    if 'name' is specified, the global connection already exists, and the
    names don't match.
    """
    global db, dbname, cursor
    if db is None:
        if name is None:
            name = 'MyDatabase'
        db = MySQLdb.connect(host='localhost', user='admin', password='admin', db=name)
        dbname = name
        cursor = db.cursor()
    elif name not in (None, dbname):
        raise Exception('cannot connect to the specified db: the global connection already exists and connects to a different db')

现在,在正常程序中(不是在每个模块中,只在顶层),您在导入mainlib.connectdb()后立即致电mainlib。在测试代​​码中,您可以调用mainlib.connectdb('TestDatabase')

可选地,您可以让connectdb返回游标和/或连接对象。这样,使用全局数据库的所有内容都可以通过此函数。

就个人而言,我更喜欢不使用全局变量 - 我会有一个创建数据库连接的函数,我会将该数据库作为参数传递给任何需要它的东西。但是,我意识到这方面的口味各不相同。

答案 1 :(得分:0)

快速解决方法是使用相同的游标,但在选择表时要明确数据库。例如,如果两个数据库中都有一个表T.

你可以做到

select * from myDatabase.T   #if you want to use the real table

select * from TestDatabase.T  #if you want to use the test table