【发布时间】:2021-08-30 02:54:34
【问题描述】:
我目前正在从事一个项目,其中大约有 100 个函数负责对 D B。根据代码是在本地服务器上还是在临时服务器上,将使用一个连接器或另一个(MySQL 或 MariaDB)。
为此,我实现了 get_cursor() 函数,该函数返回每个案例的光标。
关键是,据我所知,这不是一个好习惯,因为我必须在查询完成后关闭连接。
def get_cursor():
#MariaDB cursor for Django
if 'local' == settings.DJANGO_HOST:
conn = mariadb.connect(
user="user",
password="password",
host="localhost",
database="db-dummy")
return conn.cursor(named_tuple=True)
else:
#Default Django MySQL cursor
return connection.cursor()
#MariaDB connector
def get_some_data_mariadb(record_id):
results = []
cursor = get_cursor()
try:
cursor.execute("SELECT blabla some query")
columns = [column[0] for column in cursor.description]
results = []
for row in cursor.fetchall():
results.append(dict(zip(columns, row)))
return results
except mariadb.Error as e:
print(f"Error: {e}")
#MySQL connector
def get_some_data_mysql(record_id):
results = []
cursor = get_cursor()
cursor.execute("SELECT blablabla")
columns = [column[0] for column in cursor.description]
results = []
for row in cursor.fetchall():
results.append(dict(zip(columns, row)))
return results
现在的代码可以运行,但是如果我进行大量查询,我会收到以下错误:
OperationalError at /selected-interpretation/
Too many connections
Request Method: POST
Request URL: http://127.0.0.1:8000/selected-interpretation/
Django Version: 2.2.6
Exception Type: OperationalError
Exception Value:
Too many connections
Exception Location: /Users/user/Developer/project/subfolder/db.py in get_cursor, line 22
Python Executable: /Users/user/.virtualenvs/project/bin/python
Python Version: 3.9.4
Python Path:
['/Users/user/Developer/project',
'/usr/local/Cellar/python@3.9/3.9.4/Frameworks/Python.framework/Versions/3.9/lib/python39.zip',
'/usr/local/Cellar/python@3.9/3.9.4/Frameworks/Python.framework/Versions/3.9/lib/python3.9',
'/usr/local/Cellar/python@3.9/3.9.4/Frameworks/Python.framework/Versions/3.9/lib/python3.9/lib-dynload',
'/Users/user/.virtualenvs/project/lib/python3.9/site-packages']
Server time: Mon, 14 Jun 2021 16:13:30 +0900
有没有办法可以关闭get_cursor() 之外的连接?
【问题讨论】:
-
您看过Multiple databases 上的文档吗?更何况你为什么不简单地根据本地/登台服务器使用不同的设置文件?
-
@AbdulAzizBarkat 感谢您的见解,是的,我查看了官方文档,但由于我使用的是 MariaDB 的自定义连接器,因此没有太多关于它的信息。我根据本地/登台服务器使用不同的设置。我只想知道如何使用上述逻辑正确关闭连接。我是否应该在 get_cursor 的返回中也发送连接?
标签: python mysql django mariadb