【问题标题】:Django - permanent connection to external databaseDjango - 与外部数据库的永久连接
【发布时间】:2015-12-25 08:33:20
【问题描述】:

在向本地数据库添加记录时,我需要连接到外部数据库以导入数据。这需要相当长的时间。我的印象是,原因是在每次循环迭代期间创建一个新连接。是否可以永久设置与外部数据库的连接?

def setup_cursor():
    try:
        cursor = connections['legacy'].cursor()
        return cursor
    except ConnectionDoesNotExist:
        print "Legacy database is not configured"
        return None


def make_query(sql):
    cursor = setup_cursor()
    if cursor is None:
        return
    cursor.execute(sql)
    rows = cursor.fetchall()
    if rows is None:
        return
    return rows

def get_external_data(var):
    sql = "...."
    result = make_query(sql.format(var))
    return result

# adding records to local db
for x in y:
    add_row = SomeModel (field1=xxx, field2=get_external_data(var))
    add_row.save()

【问题讨论】:

    标签: python django database-connection


    【解决方案1】:

    在您的数据库设置中将CON_MAX_AGE 设置为None

    持久连接

    默认值为0,保留关闭的历史行为 每个请求结束时的数据库连接。启用 持久连接,将 CONN_MAX_AGE 设置为正数 秒。对于无限制的持久连接,请将其设置为无。

    例如

    DATABASES = {
        'legacy': {
            'ENGINE': 'django.db.backends.postgresql',
            'NAME': 'mydatabase',
            'USER': 'mydatabaseuser',
            'PASSWORD': 'mypassword',
            'HOST': '127.0.0.1',
            'PORT': '5432',
            'CONN_MAX_AGE': None,
        }
    }
    

    这是一个应该完成这项工作的类:

    class LegacyDatabase(object):
        cursor = None
    
        def __init__(self):
            try:
                self.cursor = connections['legacy'].cursor()
            except ConnectionDoesNotExist:
                print "Legacy database is not configured"
    
        def query(self, param):
            query = 'your query'
            if self.cursor:
                self.cursor.execute(query.format(param))
                return self.cursor.fetchall()
    

    现在在您的代码中使用 db.query(param) 来查询您的旧数据库。
    例如

    db = LegacyDatabase()
    # adding records to local db
    for x in y:
        add_row = SomeModel (field1=xxx, field2=db.query(param))
        add_row.save()
    

    阅读Django documentation - conn-max-age了解更多信息

    【讨论】:

    • 此更改后需要 10 倍的时间
    • 那是另一个问题。是的,我很奇怪,因为连接是持久的,但问题可能来自您的代码。尽管如此,这里是如何在应用程序和数据库之间启用持久连接的方法。在您的代码中搜索以查找其更长的部分。
    • 我粘贴的片段是否正确? cursor = setup_cursor() 不会在每次通话时创建新连接?
    • 当然可以。我没有你所有的脚本,但似乎你在每次调用时都创建了持久连接,这就是为什么它更慢的原因。仅设置一次连接并在每次通话时获取此连接
    • 这是我的问题。该怎么做?
    猜你喜欢
    • 2010-11-10
    • 2011-07-28
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 2023-01-03
    相关资源
    最近更新 更多