博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
管理现有数据库-web系统
阅读量:6949 次
发布时间:2019-06-27

本文共 3368 字,大约阅读时间需要 11 分钟。

1 需求

现有的业务数据需要经常被展示,所以选择django作为展示工具。只需要使用django自带的admin app,然后对现有数据库进行建模就可以搞定。

2 代码

settings:

DATABASES = {    # 'default': {    #     'ENGINE': 'django.db.backends.sqlite3',    #     'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),    # },    'default': {        'ENGINE': 'django.db.backends.mysql',        'NAME': 'mysite',        'USER': 'root',        'PASSWORD': 'root',        'HOST': '127.0.0.1',        'PORT': '3306',        'OPTIONS': {            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",        },    },    'testconfig': {        'ENGINE': 'django.db.backends.mysql',        'NAME': 'config',        'USER': 'root',        'PASSWORD': 'root',        'HOST': '127.0.0.1',        'PORT': '3306',        'OPTIONS': {            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",        },    }}DATABASE_ROUTERS = ['sqlsite.dbrouter.AppRouter']DATABASE_APPS_MAPPING = {    # example:    #'app_name':'database_name',    'app': 'testconfig',    'admin': 'default',    'auth': 'default',    'contenttypes': 'default',    'sessions': 'default',}#配置两个sql,第一个是dj自用,第二个是用于连接展示库#配置db路由,由AppRouter进行配置#db映射,将app映射到testconfig,dj自带app映射到default

  

dbrouter.py(和settings同目录)

from django.conf import settingsDATABASE_MAPPING = settings.DATABASE_APPS_MAPPINGclass AppRouter:    def db_for_read(self, model, **hints):        if model._meta.app_label in DATABASE_MAPPING:            return DATABASE_MAPPING[model._meta.app_label]        return None    def db_for_write(self, model, **hints):        if model._meta.app_label in DATABASE_MAPPING:            return DATABASE_MAPPING[model._meta.app_label]        return None    def allow_relation(self, obj1, obj2, **hints):        db_obj1 = DATABASE_MAPPING.get(obj1._meta.app_label)        db_obj2 = DATABASE_MAPPING.get(obj2._meta.app_label)        if db_obj1 and db_obj2:            if db_obj1 == db_obj2:                return True            else:                return False        return None    def allow_syncdb(self, db, model):        if db in DATABASE_MAPPING.values():            return DATABASE_MAPPING.get(model._meta.app_label) == db        elif model._meta.app_label in DATABASE_MAPPING:            return False        return None    def allow_migrate(self, db, app_label, model_name=None, **hints):        if db in DATABASE_MAPPING.values():            return DATABASE_MAPPING.get(app_label) == db        elif app_label in DATABASE_MAPPING:            return False        return None#这个文件直接cp到任何项目都可以,不用改

  

3 生成数据库模型

python3 manage.py inspectdb --database=testconfig > app/models.py#可以将现有库testconfig 的模型生成到models.py#这个功能非常方便,不再需要自己去做模型#最后在models.py里添加admin的注册功能,就可以使用admin管理先有库

  

4 bug处理

4.1 

admin多表中字段的显示,如果字段太长,它不换行,要换行显示

base.css:

/* TABLES */table {    border-collapse: collapse;    border-color: #ccc;    word-wrap: break-word;	word-break: break-all;}

  

4.2

有个数据库连接报错:SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTE。原因是版本低,为5.1。另一个5.6的就不会出现问题。

解决办法:修改settings里该mysql配置的参数

'OPTIONS': {    'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",    'isolation_level':None},#在options里设定事务隔离级别为None

  

4.3

取回的数据中文乱码,中文写入失败

 由于线上表编码为latin1,所以暂时无解。

 

4.4

使用admin修改字段时,提示字段必须填入内容

解决办法:在models中的表结构中。在字段里加入,blank=True,意思是可以在django层面允许空。

然后migrate,重启服务。

 

 

 参考

https://www.cnblogs.com/zhangxinqi/p/9094953.html

https://www.jianshu.com/p/04cd9d4f67a2

转载于:https://www.cnblogs.com/jabbok/p/9804881.html

你可能感兴趣的文章
[笔记].关于Stratix III使用非易失加密后,无法正常配置启动的问题探讨
查看>>
一个通用的单元测试框架的思考和设计03-实现篇-核心类源码
查看>>
载入史册 改变IT安全历程的十大里程碑
查看>>
UVA 624 CD
查看>>
Windows phone 7: DataBinding and UI Refresh系列教程
查看>>
矩阵快速幂 学习笔记
查看>>
linux iconv 批量转码
查看>>
使用MongoDB的GridFS保存用户文件的折腾日记
查看>>
ios开发工程师笔试基础题
查看>>
基于Struts构建新闻发布系统
查看>>
基于Struts实现用户登录和注册模块
查看>>
C++ getline函数的使用
查看>>
SQL Server删除重复行的6个方法
查看>>
Mysql 临时表的创建和删除
查看>>
db file scattered read等待事件
查看>>
linux下c的网络编程---转载
查看>>
filter中的DelegatingFilterProxy使用事例
查看>>
flashcache的实现与分析
查看>>
[UML]UML系列——状态机图statechart diagram
查看>>
微信公众平台开发(74) 用户分组管理
查看>>