【发布时间】:2021-06-08 03:24:12
【问题描述】:
在我当前的项目中,我有两台服务器:production 和 staging。
staging 服务器使用默认的 MySQL Django 连接器。
production 服务器为 MariaDB 使用自定义连接器。
通过原始查询检索数据库中的信息。我不能在这个项目中使用 ORM。
staging 和 production 都连接到项目的 git 存储库。
如果我使用暂存服务器的特定设置推送提交,当我从生产服务器 git pull 时它将不起作用,反之亦然。
我需要创建一种机制来检测服务器是生产还是暂存,并据此执行 MariaDB 或 MySQL 的特定代码。
冲突文件是:settings.py(无需解释)和db.py(包含数据库的所有逻辑,这里实现了负责查询数据库的函数)。
暂存服务器
db.py(截断):
#!/usr/bin/python
from django.db import connection
import re
from collections import namedtuple
def get_genome_id_from_start_value(start):
results = []
cursor = connection.cursor()
cursor.execute("SELECT record_id FROM `db-dummy`.g_info WHERE start = %s", ('{}%'.format(start),))
columns = [column[0] for column in cursor.description]
results = []
for row in cursor.fetchall():
results.append(dict(zip(columns, row)))
return results[0]['record_id']
settings.py(截断):
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'db-dummy',
'USER': 'user',
'PASSWORD': 'password',
'HOST': '127.0.0.1',
'PORT': '',
'TIME_ZONE': 'UTC',
}
}
产品服务器
db.py(截断)
#!/usr/bin/python
import mariadb
import re
from collections import namedtuple
def get_genome_id_from_start_value(start):
conn = mariadb.connect(
user="user",
password="password",
host="localhost",
database="db-dummy")
results = []
cursor = conn.cursor(named_tuple=True)
try:
cursor.execute("SELECT record_id FROM `db-dummy`.g_info WHERE start = ?", (start,))
columns = [column[0] for column in cursor.description]
results = []
for row in cursor.fetchall():
results.append(dict(zip(columns, row)))
return results[0]['record_id']
except mariadb.Error as e:
print(f"Error: {e}")
settings.py(截断):
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
我尝试过的:
settings.py:
STAGING = 'staging'
PROD = 'prod'
if socket.gethostname().startswith('ip-177-77-7-777'):
DJANGO_HOST = STAGING
else:
DJANGO_HOST = PROD
if PROD == DJANGO_HOST:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
else:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'db-dummy',
'USER': 'user',
'PASSWORD': 'password',
'HOST': '127.0.0.1',
'PORT': '',
'TIME_ZONE': 'UTC',
}
}
我认为这适用于 settings.py,但现在我需要一个适用于 db.py 的解决方案。
有什么建议吗?
【问题讨论】: