Django 和 SQL 服务器,符合 gevent
Django and SQL Server, gevent compliant
我想在将来可以扩展的 Django 应用程序中使用 SQL 服务器数据库。
该应用程序将 I/O 绑定,所以我认为使其可扩展的最佳方法是将 Gunicorn 与 gevent worker class.
一起使用
问题是要将 Gunicorn 与 --worker-class gevent
一起使用,Django 应用程序应该符合 gevent,并且通常会发生某些数据库客户端不兼容的情况(例如:mysqlclient lib)。
我找到了这个 SQL Django 服务器后端:https://pypi.org/project/django-mssql-backend/
但我无法理解它是否符合 gevent(又名“绿色”)。
我知道如果它只使用标准的 socket/networking python 库,可以很容易地进行猴子修补,但我不明白是否是这种情况。 pyodbc SQL 服务器后端 gevent 兼容吗?
官方手册和Google我找不到更多信息。
如果您愿意切换到 Postgresql,我已经设置了一个模块来完成您需要的一切:
这包括一个连接池来处理数千个并发连接。
** 更新 **
我有一个使用 Pymssql 的解决方案:
import gevent.socket
import pymssql
import traceback
import sys
def wait_callback(read_fileno):
gevent.socket.wait_read(read_fileno)
pymssql.set_wait_callback(wait_callback)
def conn():
return pymssql.connect(server=server, user=user, password=password, autocommit=True)
def fetchone(SQL, *args):
with conn() as c:
with c.cursor() as cursor:
try:
cursor.execute(SQL, args)
except TypeError:
cursor.execute(SQL, args[0])
except Exception as exc:
print(sys._getframe().f_back.f_code)
print(sys._getframe().f_back.f_code.co_name)
traceback.print_exc()
return ()
return cursor.fetchone()
def fetchall(SQL, *args):
with conn() as c:
with c.cursor() as cursor:
try:
cursor.execute(SQL, args)
except TypeError:
cursor.execute(SQL, args[0])
except Exception as exc:
print(sys._getframe().f_back.f_code)
print(sys._getframe().f_back.f_code.co_name)
traceback.print_exc()
return ()
return cursor.fetchall()
def execute(PSQL, *args):
with conn() as c:
with c.cursor() as cursor:
try:
cursor.execute(PSQL, args)
except TypeError:
cursor.execute(PSQL, args[0])
except ValueError:
cursor.execute(PSQL, tuple(args[0]))
except:
print(sys._getframe().f_back.f_code)
print(sys._getframe().f_back.f_code.co_name)
traceback.print_exc()
return ()
finally:
return cursor.close()
我想在将来可以扩展的 Django 应用程序中使用 SQL 服务器数据库。
该应用程序将 I/O 绑定,所以我认为使其可扩展的最佳方法是将 Gunicorn 与 gevent worker class.
一起使用问题是要将 Gunicorn 与 --worker-class gevent
一起使用,Django 应用程序应该符合 gevent,并且通常会发生某些数据库客户端不兼容的情况(例如:mysqlclient lib)。
我找到了这个 SQL Django 服务器后端:https://pypi.org/project/django-mssql-backend/ 但我无法理解它是否符合 gevent(又名“绿色”)。
我知道如果它只使用标准的 socket/networking python 库,可以很容易地进行猴子修补,但我不明白是否是这种情况。 pyodbc SQL 服务器后端 gevent 兼容吗?
官方手册和Google我找不到更多信息。
如果您愿意切换到 Postgresql,我已经设置了一个模块来完成您需要的一切:
这包括一个连接池来处理数千个并发连接。
** 更新 **
我有一个使用 Pymssql 的解决方案:
import gevent.socket
import pymssql
import traceback
import sys
def wait_callback(read_fileno):
gevent.socket.wait_read(read_fileno)
pymssql.set_wait_callback(wait_callback)
def conn():
return pymssql.connect(server=server, user=user, password=password, autocommit=True)
def fetchone(SQL, *args):
with conn() as c:
with c.cursor() as cursor:
try:
cursor.execute(SQL, args)
except TypeError:
cursor.execute(SQL, args[0])
except Exception as exc:
print(sys._getframe().f_back.f_code)
print(sys._getframe().f_back.f_code.co_name)
traceback.print_exc()
return ()
return cursor.fetchone()
def fetchall(SQL, *args):
with conn() as c:
with c.cursor() as cursor:
try:
cursor.execute(SQL, args)
except TypeError:
cursor.execute(SQL, args[0])
except Exception as exc:
print(sys._getframe().f_back.f_code)
print(sys._getframe().f_back.f_code.co_name)
traceback.print_exc()
return ()
return cursor.fetchall()
def execute(PSQL, *args):
with conn() as c:
with c.cursor() as cursor:
try:
cursor.execute(PSQL, args)
except TypeError:
cursor.execute(PSQL, args[0])
except ValueError:
cursor.execute(PSQL, tuple(args[0]))
except:
print(sys._getframe().f_back.f_code)
print(sys._getframe().f_back.f_code.co_name)
traceback.print_exc()
return ()
finally:
return cursor.close()