Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用多个脚本安全连接到postgres_Python_Sql_Postgresql - Fatal编程技术网

Python 如何使用多个脚本安全连接到postgres

Python 如何使用多个脚本安全连接到postgres,python,sql,postgresql,Python,Sql,Postgresql,我已经开始学习如何与Python一起编写psycopg2。我所做的是,我有相当多的脚本。让我们举一个例子,其中最多可以有150个连接,我们知道,我们不能同时连接超过100个连接。我发现,每当我想进行数据库查询/执行时,我就会连接到数据库,执行,然后关闭数据库。然而,我确实认为,打开和关闭新的连接是非常昂贵的,应该更长寿 我做过这样的事情: DATABASE_CONNECTION = { "host": "TEST", "datab

我已经开始学习如何与Python一起编写psycopg2。我所做的是,我有相当多的脚本。让我们举一个例子,其中最多可以有150个连接,我们知道,我们不能同时连接超过100个连接。我发现,每当我想进行数据库查询/执行时,我就会连接到数据库,执行,然后关闭数据库。然而,我确实认为,打开和关闭新的连接是非常昂贵的,应该更长寿

我做过这样的事情:

DATABASE_CONNECTION = {
    "host": "TEST",
    "database": "TEST",
    "user": "TEST",
    "password": "TEST"
}


def get_all_links(store):
    """
    Get all links from given store
    :param store:
    :return:
    """

    conn = psycopg2.connect(**DATABASE_CONNECTION)

    sql_update_query = "SELECT id, link FROM public.store_items WHERE store = %s AND visible = %s;"

    cursor = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)

    try:

        data_tuple = (store, "yes")
        cursor.execute(sql_update_query, data_tuple)

        test_data = [{"id": links["id"], "link": links["link"]} for links in cursor]
        cursor.close()
        conn.close()
        return test_data

    except (Exception, psycopg2.DatabaseError) as error:
        print("Error: %s" % error)
        cursor.close()
        conn.rollback()
        return 1



def get_all_stores():
    """
    Get all stores in database
    :return:
    """

    conn = psycopg2.connect(**DATABASE_CONNECTION)

    sql_update_query = "SELECT store FROM public.store_config;"

    cursor = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)

    try:

        cursor.execute(sql_update_query)

        test_data = [stores["store"] for stores in cursor]

        cursor.close()
        conn.close()
        return test_data

    except (Exception, psycopg2.DatabaseError) as error:
        print("Error: %s" % error)
        cursor.close()
        conn.rollback()
        return 1
我想知道如何才能使它尽可能有效,我可以有很多脚本连接到数据库,但仍然没有触及最大连接问题

我忘了补充一点,我连接的方式是我有多个脚本等:

test1.py
test2.py
test3.py
....
....
每个脚本都为自己运行

它们都有一个import
database.py
,其中包含我之前展示的以下代码

更新:

from psycopg2 import pool

threaded_postgreSQL_pool = psycopg2.pool.ThreadedConnectionPool(1, 2,
                                                                user="test",
                                                                password="test",
                                                                host="test",
                                                                database="test")

if (threaded_postgreSQL_pool):
    print("Connection pool created successfully using ThreadedConnectionPool")
    

def get_all_stores():
    """
    Get all stores in database
    :return:
    """

    # Use getconn() method to Get Connection from connection pool
    ps_connection = threaded_postgreSQL_pool.getconn()

    sql_update_query = "SELECT store FROM public.store_config;"

    ps_cursor = ps_connection.cursor(cursor_factory=psycopg2.extras.DictCursor)

    try:

        ps_cursor.execute(sql_update_query)

        test_data = [stores["store"] for stores in ps_cursor]

        ps_cursor.close()

        threaded_postgreSQL_pool.putconn(ps_connection)
        print("Put away a PostgreSQL connection")

        return test_data

    except (Exception, psycopg2.DatabaseError) as error:
        print("Error: %s" % error)
        ps_cursor.close()
        ps_connection.rollback()
        return 1

你是对的,建立数据库连接是昂贵的;因此,您应该使用连接池。但没有必要重新发明车轮,因为:


使用
psycopg2.pool.SimpleConnectionPool
psycopg2.pool.ThreadedConnectionPool
(取决于是否使用线程),并使用
getconn()
putconn()
方法获取或返回连接。

你是对的,建立数据库连接是昂贵的;因此,您应该使用连接池。但没有必要重新发明车轮,因为:


使用
psycopg2.pool.SimpleConnectionPool
psycopg2.pool.ThreadedConnectionPool
(取决于是否使用线程),并使用
getconn()
putconn()
方法来获取或返回连接。

打开和关闭数据库连接时不是免费的,与启动和停止python解释器相比,它也没有那么昂贵。如果您的所有脚本都独立且短暂地运行,那么这可能是您应该修复的第一件事。在知道如何(以及是否)使用连接池之前,您必须决定并描述脚本的调度和调用方式

正如我们所知,我们不能同时连接超过100个连接


100是max_连接的默认设置,但它是完全可配置的。如果你想的话,你可以增加它。如果您为了性能而重构,那么您可能应该以一种自然的方式进行重构,这意味着您不需要提高max_连接。但是,仅仅因为不想增加max_连接而进行重构是在自讨苦吃。

虽然打开和关闭数据库连接不是免费的,但与启动和停止python解释器相比,它也不那么昂贵。如果您的所有脚本都独立且短暂地运行,那么这可能是您应该修复的第一件事。在知道如何(以及是否)使用连接池之前,您必须决定并描述脚本的调度和调用方式

正如我们所知,我们不能同时连接超过100个连接


100是max_连接的默认设置,但它是完全可配置的。如果你想的话,你可以增加它。如果您为了性能而重构,那么您可能应该以一种自然的方式进行重构,这意味着您不需要提高max_连接。但是,仅仅因为你不想提高max_connections,就进行重构是任人摆布。

See@clamp我不确定这是否会有好处。如果每个脚本都导入database.py文件,我可能是错误的,显然会被误解,但如果我错了,请纠正我。处理连接的方式有不同的选择。一般来说,一个游泳池可以使连接更便宜。请参阅()。@clamp哦,我明白了,我想我需要在连接到DB的同一台服务器/主机上安装它?那是不是意味着我的代码很好?或者这是我在两者之间缺少的东西吗?请参阅@clamp我不确定这是否有好处如果每个脚本都将导入database.py文件,我可能是错误的,显然会被误解,但请纠正我,如果我错了,有不同的选项如何处理连接。一般来说,一个游泳池可以使连接更便宜。请参阅()。@clamp哦,我明白了,我想我需要在连接到DB的同一台服务器/主机上安装它?那是不是意味着我的代码很好?还是我在这两者之间错过了什么?你好Laurenz!我现在已经在线程中做了一个更新,如果你能看看的话。你的意思是这样的吗?然而,当我使用它时,我可能会想到的问题仍然存在。如果我有几个自己运行的脚本(我的意思是我启动py test1.py、py test2.py、py test3.py…最多150个),实际会发生什么。这仍然算是150连接吗?或者这个方法如何工作?乍一看还行,但我不太懂Python。如果您启动了许多不同的Python解释器实例,那么最终将得到许多连接池,而这一目的将无法实现。但是,如果你的应用程序有多个线程,它们将共享一个连接池,那么就这样做吧!我现在已经在线程中做了一个更新,如果你能看看的话。你的意思是这样的吗?然而,当我使用它时,我可能会想到的问题仍然存在。如果我有几个自己运行的脚本(我的意思是我启动py test1.py、py test2.py、py test3.py…最多150个),实际会发生什么。这仍然算是150连接吗?或者这个方法如何工作?乍一看还行,但我不太懂Python。如果您启动了许多不同的Python解释器实例,那么最终将得到许多连接池,而这一目的将无法实现。但是如果你的申请