管理现有数据库-web系统

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 settings
DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING

class 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值