zoukankan      html  css  js  c++  java
  • 管理现有数据库-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

  • 相关阅读:
    C# Array.Sort 省内排序
    Centos7开机启动tomcat8
    使用GeoWebCache发布ArcGIS切片地图(实现高清电子地图)
    获取经纬度之间距离的Java工具类
    centos7上安装rar解压软件
    GeoServer之发布Geotiff存在的问题
    $GPRMC解析
    如何在IDEA单元测试中使用Scanner获取输入内容
    GeoServer修改使用内存
    Github无法访问解决办法
  • 原文地址:https://www.cnblogs.com/jabbok/p/9804881.html
Copyright © 2011-2022 走看看