大佬教程收集整理的这篇文章主要介绍了Django多个动态数据库,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
话虽如此,我也有同样的问题,我想为每个用户创建一个唯一的数据库。这样做的原因是,我为用户提供了一种功能,使其可以保存/访问未存储在服务器上的数据库,这需要具有多个数据库,因此每个用户一个。
建议不要使用此答案来达到期望的目标。我很想听听django-guru的意见,介绍如何最好地解决这个问题。但是,这是我一直在使用的一种解决方案,到目前为止效果很好。我正在使用SQLite,但是可以轻松地对任何数据库进行修改。
总之,这是过程:
1)首先,在创建新用户时,我在设置中创建了一个新数据库。这段代码在我看来是创建新用户的地方。
from YOUR_PROjeCt_name import setTings
database_ID = user.username #just something unique
newDatabase = {}
newDatabase["ID"] = database_ID
newDatabase['ENGINE'] = 'django.db.BACkends.sqlite3'
newDatabase['name'] = '/path/to/db_%s.sql' % database_ID
newDatabase['USER'] = ''
newDatabase['passworD'] = ''
newDatabase['HOST'] = ''
newDatabase['PORT'] = ''
setTings.DATABASES[database_ID] = newDatabase
save_db_setTings_to_file(newDatabasE) #this is for step 2)
该脚本将“运行时”数据库设置加载到django项目设置中。但是,如果重新启动服务器,则该数据库将不再处于设置中。
2)为便于在服务器重新启动时自动重新加载这些设置,我为每个数据库创建了一个文件,该文件将在服务器启动时立即加载。创建此文件由以下功能执行save_db_setTings_to_file:
def save_db_setTings_to_file(db_setTings):
path_to_store_setTings = "/path/to/your/project/YOUR_PROjeCt_name/database_setTings/"
newDbString = """
DATABASES['%(ID)s'] = {
'ENGINE': '%(ENGINE)s', # Add 'POSTGResql_psycopg2', 'MysqL', 'sqlite3' or 'Oracle'.
'name': '%(Name)s', # Or path to database file if using sqlite3.
'USER': '', # Not used with sqlite3.
'passworD': '', # Not used with sqlite3.
'HOST': '', # Set to empty String for localhost. Not used with sqlite3.
'PORT': '', # Set to empty String for default. Not used with sqlite3.
}
""" % db_setTings
file_to_store_setTings = os.path.join(path_to_store_setTings, db_setTings['ID'] + ".py")
write_file(file_to_store_setTings, newDbString) #psuedocode for compactness
3)要在启动服务器时实际加载这些设置,我在的最底部添加了一行,该行将/path/to/your/project/YOUR_PROjeCt_name/setTings.py每个文件加载到setTings文件夹中并运行它,从而将数据库详细信息加载到设置中。
import setTings_manager
然后,import setTings_manager将在加载文件/path/to/your/project/YOUR_PROjeCt_name/setTings_manager.py,其中包含以下代码:
from setTings import DATABASES
import os
path_to_store_setTings = "/path/to/your/project/YOUR_PROjeCt_name/database_setTings/"
for fname in os.Listdir(path_to_setTings):
full_path = os.path.join(path_to_setTings, fName)
f = open(full_path)
content = f.read()
f.close()
exec(content) #you'd better be sure that the file doesn't contain anything malicIoUs
请注意,你可以将此代码直接放在setTings.py的底部而不是import语句的底部,但是使用import语句可以使setTings.py的抽象级别保持一致。
这是一种加载每个数据库设置的便捷方法,因为要从设置中删除数据库,你要做的就是删除设置文件,并且下次服务器重新启动时,它不会将这些详细信息加载到设置中,并且数据库将无法访问。
就像我说的那样,这种方法行之有效,到目前为止,我已经成功使用了它,但这并不是理想的解决方案。如果有人可以发布更好的解决方案,我将不胜感激。
有什么不好的地方:
以上是大佬教程为你收集整理的Django多个动态数据库全部内容,希望文章能够帮你解决Django多个动态数据库所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。