精华内容
下载资源
问答
  • 主要介绍了sqlite迁移到mysql脚本的方法,需要的朋友可以参考下
  • SQLITE 迁移到 MYSQL

    2010-09-09 11:29:10
    接同事需求,要求从SQLITE的数据转到MYSQL,这东西以前也没接触过。这里搜搜,那里试试,下面把过程列一下。 主要过程分三步:1,把SQLITE表结构导出来,作一定的格式调整2,把SQLITE数据导出来,作特殊字符的处理3...
    接同事需求,要求从SQLITE的数据转到MYSQL,这东西以前也没接触过。这里搜搜,那里试试,下面把过程列一下。
    主要过程分三步:
    1,把SQLITE表结构导出来,作一定的格式调整
    2,把SQLITE数据导出来,作特殊字符的处理
    3,导出MYSQL(注意字符集)
    [@more@]

    下面是我操作的过程, 有两个部分:单表操作和批量处理(含脚本)

    ########### 单表操作 ####################
    # 打开SQLITE DB
    root> sqlite3 mig.db

    # 查看表,可用用".help"获得帮助
    sqlite>.tables

    # 导出数据表结构
    sqlite>.output /tmp/heyf/createtable.sql
    sqlite>.schema accounts_profile

    # 调整建表语句格式, 把双引号去掉,并加上MYSQL的建表约束。
    root>sed 's/"/`/g' createtable.sql > create_onmysql.sql
    root>sed -i -e 's/^);$/) engine=innodb default charset=utf8 collate=utf8_bin ;/g' create_onmysql.sql
    root>sed -i 's/integer.*PRIMARY KEY/int NOT NULL auto_increment PRIMARY KEY/g' create_onmysql.sql
    # sqlite中,为 INTEGER PRIMARY KEY 的字段将自动增加
    root>sed -i 's/ text/ longtext/g' create_onmysql.sql
    # sqlite中,text 最大长度为2G, 在MYSQL中需要改成longtext;

    # 在MYSQL把表建上:
    mysql -uroot -h127.0.0.1 --default-character-set=utf8 test < create_onmysql.sql

    # 导出数据
    sqlite>.mode insert accounts_profile_starred_review_requests
    sqlite>.output /tmp/heyf/accounts_profile_starred_review_requests.sql
    sqlite>select * from accounts_profile_starred_review_requests;
    sqlite>.output stdout

    # 处理特殊字符
    DOTABLE=accounts_profile_starred_review_requests
    cd /tmp/heyf
    DOFILE=${DOTABLE}.sql
    sed -e "s///g" $DOFILE > ${DOFILE}.new

    # 将数据导入MYSQL
    mysql -uroot -h127.0.0.1 --default-character-set=utf8 test -e "truncate table ${DOTABLE};"
    mysql -uroot -h127.0.0.1 --default-character-set=utf8 test < ${DOFILE}.new





    如果表很多:那我们就需要批量处理一下啦,下面是一些批量脚本 :
    ########### 批量处理 ####################

    # 打开SQLITE DB
    root> sqlite3 mig.db

    # 查看表
    sqlite>.tables
    # 把所有表名都放入TABLE.LIST文件

    # 导出数据表结构
    sqlite>.output /tmp/heyf/createtable.sql
    sqlite>.schema accounts_profile
    sqlite>.schema ... ....

    #在MYSQL 创建表结构
    root>sed 's/"/`/g' createtable.sql > create_onmysql.sql
    root>sed -i -e 's/^);$/) engine=innodb default charset=utf8 collate=utf8_bin ;/g' create_onmysql.sql
    root>sed -i 's/integer.*PRIMARY KEY/int NOT NULL auto_increment PRIMARY KEY/g' create_onmysql.sql
    # sqlite中,为 INTEGER PRIMARY KEY 的字段将自动增加
    root>sed -i 's/ text/ longtext/g' create_onmysql.sql
    # sqlite中,text 最大长度为2G, 在MYSQL中需要改成longtext;

    root>mysql -uroot -h127.0.0.1 --default-character-set=utf8 test < /tmp/heyf/create_onmysql.sql

    # SQLITE 中导出数据

    ## 将所有的表生成导出语句(SQLITE)
    ## cat create_exp.sh
    -------------------------
    #!/bin/bash
    [ $# -ne 1 ] && exit 1
    TABFILE=$1
    WORKDIR=/tmp/heyf/dmpfile/
    OUTFILE=exp.sql
    while read LINE
    do
    echo $LINE
    echo ".mode insert $LINE" >> $OUTFILE
    echo ".output $WORKDIR/${LINE}.sql ">> $OUTFILE
    echo "select * from $LINE ;" >> $OUTFILE
    echo ".output stdout " >> $OUTFILE
    done < $TABFILE
    -------------------------

    ## 运行后将产生 sqlite 所有表的导出语句
    sh create_exp.sh table.list

    ## 现在进行SQLITE可以将所有表的数据导出来。
    sqlite3 /home/admin/foryunfei/heyf.db
    .read /tmp/heyf/exp.sql

    # 处理特殊字符
    ## 现在需要将所有的SQL文件中的""替换成”“,以使SQL能正确执行
    ## cat replace.sh
    -------------------------
    #!/bin/bash
    [ $# -ne 1 ] && exit 1
    TABFILE=$1
    WORKDIR=/tmp/heyf/dmpfile/
    while read DOTABLE
    do
    cd $WORKDIR
    DOFILE=${DOTABLE}.sql
    sed -e "s///g" $DOFILE > ${DOFILE}.new
    done < $TABFILE
    -------------------------

    ## sh replace.sh table.list

    ## 将数据导入MYSQL
    ## cat imp.sh
    -------------------------
    #!/bin/bash
    [ $# -ne 1 ] && exit 1
    TABFILE=$1
    WORKDIR=/tmp/heyf/dmpfile/
    while read DOTABLE
    do
    cd $WORKDIR
    mysql -uroot -h127.0.0.1 --default-character-set=utf8 test -e "truncate table ${DOTABLE};"
    mysql -uroot -h127.0.0.1 --default-character-set=utf8 test < ${DOTABLE}.sql.new
    done < $TABFILE
    -------------------------

    ## sh imp.sh table.list

    来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/703656/viewspace-1038111/,如需转载,请注明出处,否则将追究法律责任。

    转载于:http://blog.itpub.net/703656/viewspace-1038111/

    展开全文
  • 阿里云申请 ✔ python安装 ✔ 虚拟环境搭建 ✔ Django安装配置 ✔ Apache安装 ✔ ...接下来需要把原项目中使用的sqlite迁移到mysql中 修改settings.py 首先想到的就是将Django项目里的setting.py中的...
    • 阿里云申请 ✔
    • python安装 ✔
    • 虚拟环境搭建 ✔
    • Django安装配置 ✔
    • Apache安装 ✔
    • Apache+Django配置 ✔
    • git服务器搭建,实现版本控制同时部署代码 ✔
    • 本地项目使用git发布至服务器端 ✔
    • mysql安装配置 ✔

    接下来需要把原项目中使用的sqlite迁移到mysql中

    千万注意:在迁移前确保mysql的字符集已经修改为utf8或者utf8mb4,否则遇到中文的话问题会出现编码错误!!修改方法见Ubuntu下Mysql的安装和配置

    修改settings.py

    首先想到的就是将Django项目里的setting.py中的DATABASES项改为mysql,原来的sqlite注释掉别删,等会还要用到

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'DataBaseName',
            'USER': 'user',
            'PASSWORD': 'password',
            'HOST': 'HostName',
            'PORT': '3306',
        }
    }
    

    然后运行python manage.py makemigrations创建迁移文件

    当然没这么简单,直接报错:ModuleNotFoundError: No module named 'MySQLdb'

    安装mysql相关库

    使用pip安装pymysqlmysqlclient库,再次创建迁移文件,提示:No changes detected
    在这里插入图片描述

    这是因为之前使用sqlite时已经做过了迁移操作,且之后没有任何更新,所以要加上参数为指定应用来强制创建空的数据库迁移文件:python manage.py makemigrations --empty [应用名称]

    然后执行迁移操作:python manage.py migrate

    查看mysql数据库,已经在相应数据库中创建了空表

    从sqlite导出数据

    将Django项目里的setting.py中的DATABASES项再改为sqlite

    执行命令将数据导出为json文件:python manage.py dumpdata > initial_data.json

    有小坑,看下面!!

    将数据导入mysql

    再次将setting.py中的DATABASES项改为mysql

    执行命令导入json文件:python manage.py loaddata initial_data.json,报错:
    在这里插入图片描述

    发现该json文件是utf-16LE编码,改为utf-8保存,再次导入,继续报错:
    在这里插入图片描述

    错误信息提示content_type表出错,网上查询得知Django自带的contentType会导致该问题,解决方法是在导出数据的时候加上参数--exclude来跳过部分表:python manage.py dumpdata --exclude=contenttypes --exclude=auth.Permission > initial_data.json

    重新导出json,再次loaddata导入,没有报错,查看数据库的数据正常

    网站访问出错

    以为大功告成,结果访问网站却又报错了:

    The server encountered an internal error or misconfiguration and was unable to complete your request.

    这是因为在本地python中安装了pymysqlmysqlclient库,而服务器端没安装,使用python -m pip安装这两个库,但在安装mysqlclient时又产生错误:OSError: mysql_config not found

    网上查询得知这是Ubuntu系统缺少libmysqld-devlibmysqlclient-dev 两个包,apt install安装两个包后,再次安装mysqlclient库,重启apache服务,访问网站,成功!

    展开全文
  • 前言 Django开发的时候为了方面,内置了sqlite数据库,可以直接用,不用过多关心,直接ORM操作即可。...等我们Django业务基本开发完了,部署之前,我们最好把SQLite迁移到Mysql,现在本地Mac电脑...

    前言

    Django开发的时候为了方面,内置了sqlite数据库,可以直接用,不用过多关心,直接ORM操作即可。

    Mysql Sqlite
    特点 为服务端设计 轻量级,可嵌入手机应用
    高并发 不能
    占用内存 比SQLite
    适用性 服务器 手机,桌面应用

    等我们Django业务基本开发完了,部署之前,我们最好把SQLite迁移到Mysql,现在本地Mac电脑为例,操作一下迁移以及遇到的坑

    安装

    方式一(手动安装,不推荐)

    - 下载地址:https://www.mysql.com/downloads/
    - 滚动网页至最下方,选择`DOWNLOADS => MySQL  Community  Server`
    

    跟着提示安装后需要配置环境变量
    不配置环境变量的话,执行mysql命令,必须在mysql的安装目录下,所以选择配置环境变量。在终端中,进入到用户目录下,执行 vim .bash_profile 或者直接执行vim ~/.bash_profile ,按i进入编辑模式,添加如下内容,按esc,输入:wq退出并保存。

    # mysql
    export PATH=${PATH}:/usr/local/mysql/bin
    #快速启动、结束MySQL服务, 可以使用alias命令
    alias mysqlstart='sudo /usr/local/mysql/support-files/mysql.server start'
    alias mysqlstop='sudo /usr/local/mysql/support-files/mysql.server stop'
    

    我们就可以在任何地方执行mysql命令了。

    • 终端输入myqsl -u root -p启动MySQL,安装地址是/usr/local/mysql

    方式二(Homebrew)

    brew install mysql
    # brew uninstall mysql
    # brew list
    mysql -V
    mysql  Ver 8.0.18 for osx10.14 on x86_64 (Homebrew)
    

    以上安装成功默认是没有密码的,MySQL 8以上新增了安全配置引导,下面有介绍,如果不想设置密码,可以直接进入

    mysql -u root -p
    直接回车即可
    

    MySQL 密码安全设置

    MySQL 8新增了安全设置向导,对于在服务器部署MySQL来说,简化了安全设置的操作。

    1. 密码强度验证插件
    2. 修改root账号密码
    3. 移除匿名用户
    4. 禁用root账户远程登录
    5. 移除测试数据库(test)
    6. 重新加载授权表
    • 示例
    /usr/local/opt/mysql/bin/mysql_secure_installation # mysql 提供的配置向导
    
    Securing the MySQL server deployment.
    
    Enter password for user root:
    
    VALIDATE PASSWORD COMPONENT can be used to test passwords
    and improve security. It checks the strength of password
    and allows the users to set only those passwords which are
    secure enough. Would you like to setup VALIDATE PASSWORD component?
    
    Press y|Y for Yes, any other key for No: no
    #这里我选了不安全密码强度验证插件
    
    Using existing password for root.
    Change the password for root ? ((Press y|Y for Yes, any other key for No) : no
    #这里我选了不修改root密码
     ... skipping.
     
    By default, a MySQL installation has an anonymous user,
    allowing anyone to log into MySQL without having to have
    a user account created for them. This is intended only for
    testing, and to make the installation go a bit smoother.
    You should remove them before moving into a production
    environment.
    
    Remove anonymous users? (Press y|Y for Yes, any other key for No) : yes
    Success.
    #这里我选择了移除匿名用户
    
    
    Normally, root should only be allowed to connect from
    'localhost'. This ensures that someone cannot guess at
    the root password from the network.
    
    Disallow root login remotely? (Press y|Y for Yes, any other key for No) : yes
    Success.
    #这里我选择了禁用root账号远程登录访问
    
    By default, MySQL comes with a database named 'test' that
    anyone can access. This is also intended only for testing,
    and should be removed before moving into a production
    environment.
    
    Remove test database and access to it? (Press y|Y for Yes, any other key for No) : no
     ... skipping.
     #这里我选择了不移除测试数据库
     
    Reloading the privilege tables will ensure that all changes
    made so far will take effect immediately.
    
    Reload privilege tables now? (Press y|Y for Yes, any other key for No) : yes
    Success.
    #这里我选择了重新加载权限表,因为我前面选择了禁用root账号远程登录访问
    
    All done!
    

    MySQL忘记了Root密码操作(em…这个真的很重要)

    MySQL官网链接忘记密码操作
    这里看下除了Window的其他系统如何操作。
    1.如果有不要,请先停止MySQL相关服务。

    ps -ef | grep mysql
    
    1118089483  2247     1   0  3:12下午 ttys000    0:00.02 /bin/sh /usr/local/Cellar/mysql/8.0.18/bin/mysqld_safe --datadir=/usr/local/var/mysql --pid-file=/usr/local/var/mysql/FVFXGM44HV29.pid
    1118089483  2358  2247   0  3:12下午 ttys000    0:04.24 /usr/local/Cellar/mysql/8.0.18/bin/mysqld --basedir=/usr/local/Cellar/mysql/8.0.18 --datadir=/usr/local/var/mysql --plugin-dir=/usr/local/Cellar/mysql/8.0.18/lib/plugin --log-error=FVFXGM44HV29.err --pid-file=/usr/local/var/mysql/FVFXGM44HV29.pid
    1118089483  2522  2154   0  3:24下午 ttys000    0:00.01 grep mysql
    
    如果有相关进程,需要关闭
    mysql.service stop
    
    # kill pid 
    

    2.--skip-grant-tables启动
    该方法重启,任何人都无需密码就可以使所有的权限,因此,我们会跟上--skip-networking阻止远程链接

    /usr/local/bin/mysqld --skip-grant-tables --skip-networking &
    

    3.修改密码
    这里直接alter是会报错的,需要先刷新权限

    mysql> FLUSH PRIVILEGES;
    mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';
    mysql> show columns from user; # 查看列  desc 表名;
    mysql> select host, user, authentication_string from user;  # 查看信息
    

    4.这里的密码默认都是高强度的,别入你之前通过安全设置设置过,你可以修改对应的全局密码管理设置

    mysql> show variables like 'validate_password%';
    +--------------------------------------+--------+
    | Variable_name                        | Value  |
    +--------------------------------------+--------+
    | validate_password.check_user_name    | ON     |
    | validate_password.dictionary_file    |        |
    | validate_password.length             | 8      |
    | validate_password.mixed_case_count   | 1      |
    | validate_password.number_count       | 1      |
    | validate_password.policy             | MEDIUM |
    | validate_password.special_char_count | 1      |
    +--------------------------------------+--------+
    7 rows in set (0.00 sec)
    
    mysql> 
    

    这里看到倒数第二条是MEDIUM,我们需要改成LOW,修改密码强度

    SET GLOBAL validate_password.policy=LOW;
    

    然后修改密码位数

    SET GLOBAL validate_password.length=6;
    

    现在可以为MySQL设置简单密码了,只要满足六位的长度即可,

    ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';
    

    重启

    mysql.server restart
    #也可以使用命令:brew services restart mysql
    #不过建议使用命令:mysql.server restart在出错时可以看到更准确完整的信息
    

    建表

    我们开发时用的SQLite数据库,在生产部署之前都要把本地的数据表迁移到MySQL去。由于MySQL的密码强度问题,经常忘记密码的同学直接去上面的知识点操作一下。下面开始建数据库,准备配置到Django的setting.py中去。

    ps -ef | grep mysql
    # 没启动就启动
    mysql.service start
    # 进入
    mysql -u root -p
    # 查看
    show databases;
    # 开始创建
    create database mikejingsitedb charset=utf8mb4 default collate utf8mb4_unicode_ci;
    

    看到这里有些小伙伴会觉得有点不对啊,一般的操作是create database xxx charset=utf8,这里花里胡哨的操作的参数,下面介绍下

    collate和charset用法

    default collate utf8mb4_unicode_ci; 介绍collate之前先说个题外话,大家应该都很熟悉,mysql中utf8和utf8mb4两种编码,可以这么说吧,大家可以忘记这个utf8这个东西,永远使用utf8mb4,这是MySQL的遗留问题,utf8最多支持3bytes字节长度的字符编码,对于一些需要占据4个字节的文字,比如emoji表情,mylsqutf8就不支持了,要使用utf8mb4才行。

    所谓collate utf8mb4_unicode_ci,通俗的翻译为校验通过utf8超集,utf8mb4(utf8 mobile 4bytes)的unicode编码,而且是case insensitive(忽略大小写,还有个缩写是cs=case sensitive,顾名思义开始需要比较大小写)。对于MySQL中那些类型字段,如VARCHAR,CHAR,TEXT类型的列,都需要一个COLLATE类型来告诉他们排序的规则。简而言之,COLLATE会影响到ORDER BY语句的顺序,会影响到WHERE条件中大于小于号筛选出来的结果,会影响DISTINCTGROUP BYHAVING语句的查询结果。凡是涉及到排序,比较的地方,都会和COLLATE有关。

    详细的介绍可以查看这个文章

    MySQL字符编码

    有了上面的介绍,我们就需要在my.cnf(Mac) my.ini(Windows)进行字符集配置。
    默认字符集使用utf8mb4版本

    #修改配置文件
    vim /usr/local/etc/my.cnf
    
    [mysqld]
    ...
    [mysql]
    # 设置mysql客户端默认字符集
    default-character-set=utf8mb4
    [client]
    default-character-set=utf8mb4
    
    character-set-server=utf8mb4
    collation-server=utf8mb4_general_ci
    
    • 重启查看
    mysql.server restart
    #也可以使用命令:brew services restart mysql
    #不过建议使用命令:mysql.server restart在出错时可以看到更准确完整的信息
    
    

    MySQL不同版本加密方式兼容

    1.配置文件修改
    MySQL 8.0默认是cacheing_sha2_password 5.7和5.6是mysql_native_password,为了兼容设置如下把默认加密方式改成default_authentication_plugin = mysql_native_password

    新版本如果你用Navicat去链接,就会报错

    2059 - Authentication plugin 'caching_sha2_password' cannot be loaded: dlopen(../Frameworks/caching_sha2_password.so, 2): image not found
    

    编辑vim /usr/local/etc/my.cnf插入一条数据
    default_authentication_plugin=mysql_native_password
    上面的这种方案对已有的账户是无法修改的,只是后续新增的账户就会默认的Plugin变成mysql_native_password
    在这里插入图片描述
    2.sql修改

    ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; #修改加密规则 
    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; #更新一下用户的密码 
    FLUSH PRIVILEGES; #刷新权限
    

    因此,后面授权新用户的方式可以在后面跟一个加密方式,默认是跟着配置文件走

    create user 'root'@'localhost' identified WITH mysql_native_password BY 'password';
    grant all privileges on *.* to root@'localhost' with grant option;
    flush privileges;
    

    时区问题(后面启动博客就能遇到)

    这里先把数据库的时区问题解决了
    macOS。这些文件的一个可能位置是/usr/share/zoneinfo 目录 导入mysql数据时区

    mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql -p
    

    导入后可以通过下面两个方式查看时区是否正确

    select timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00')); 
    SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP); 
    
    # 如果是中国标准时间, 会输出08:00
    

    配置Django的数据库为MySQL

    create database mikejingsitedb charset=utf8mb4 default collate utf8mb4_unicode_ci;
    1.上面已经创建好了数据库,开始配置settings.py

    # DATABASES = {
    #     'default': {
    #         'ENGINE': 'django.db.backends.sqlite3',
    #         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    #     }
    # }
    # mikejingsitedb    mkjkejingsitedb2
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql', # 后端数据库引擎
            'NAME': 'mkjkejingsitedb2', # Django对应mysql数据库的名字
            'USER': 'mkj', # 用户
            'PASSWORD': 'M@ikejing123', # 密码
            'HOST': 'localhost', # ip
            'PORT': '3306', # 端口
        }
    }
    

    注意分配用户:
    我们上面的操作都是MySQL的root用户,有最高权限,不能直接写在这里,因此需要分配对应数据库权限的用户。

    # 查看用户
    select host, user from user;
    
    # 创建新用户
    create user 'xxx'@'localhost' identified by 'xxxx';
    grant all privileges on mikejingsitedb.* to 'mkj'@'localhost'; # 分配mikejingsitedb的所有表权限
    flush privileges; # 刷新
    
    # 修改已有权限用户
    # grant all privileges on mikejingsitedb.* to '已有用户'@'localhost'; # 分配mikejingsitedb的所有表权限
    # flush privileges; # 刷新
    
    # 登录查看
    mysql -u mkj -p 
    show databases; # 只能查看对应的数据库
    

    2.启动测试
    如果这个时候直接运行python manager.py runserver会提示没有迁移,先执行python manager.py migrate执行迁移。这里正常情况下就会报错了,因为Django不同版本的数据库操作类不同,提示是没有clientmysql类似的这种中,Mac中你直接安装pip install xxx也会安装不上,Windows会有whl版本直接安装编译好的插件。Mac网上那些文章都是直接安装pip install pymysql但是后续的问题就来了。

    解决方法:
    Django连接MySQL时默认使用MySQLdb驱动,但MySQLdb不支持Python3,因此这里将MySQL驱动设置为pymysql,使用 pip install pymysql 进行安装,然后在工程文件__init__.py添加以下代码即可。

    #安装pymysql
    pip install pymysql
    
    #__init__.py
    import pymysql
    pymysql.install_as_MySQLdb()
    

    又会报错

    django2.2/mysql ImproperlyConfigured: mysqlclient 1.3.13 or newer is
    required; you have 0.9.3

    第一种:
    django降到2.1.4版本就OK了
    第二种:修改源码
    在这里插入图片描述

    # 找到base.py文件,注释掉 base.py 中如下部分(35/36行)
    if version < (1, 3, 3):
         raise ImproperlyConfigured("mysqlclient 1.3.3 or newer is required; you have %s" % Database.__version__)
    
    

    此时还不够,依然会报错AttributeError: ‘str’ object has no attribute ‘decode’

    #找到operations.py文件(46行,版本不同行数不同哈~自个儿find一下),将decode改为encode
    #linux vim 查找快捷键:?decode
    if query is not None:
        query = query.decode(errors='replace')
    return query
    #改为
    if query is not None:
        query = query.encode(errors='replace')
    return query
    

    OK,问题解决,可以进行迁移了。

    3.执行迁移
    python manager.py migrate,可以看到log都是成功的,就说明表迁移成功。

    4.SQLite数据导出,导入MySQL

    # 打开settings.py 的 sqlite注解 注释掉mysql 导出
    python manager.py dumpdata > data.json
    
    # 打开settings.py 的 mysql注解 注释掉sqlite 导入
    python manage.py loaddata data.json
    

    确保Mysql用户表里为空的,如果之前有迁移过数据到Mysql,有可能会出错。注意出错的时候所报的错误信息。如果提示有重复主键,那需要先删掉数据。这些数据是在给MySQL数据库应用迁移文件的时候产生的,一般是content_type相关的表。

    use 你的数据库名;
    delete from auth_permission;
    delete from django_content_type;
    

    继续导入

    python manage.py loaddata data.json
    Installed 1057 object(s) from 1 fixture(s)
    

    这里导入数据,如果你编码问题,就会遇到各种报错,比如这种编码问题报错
    我们建库的时候已经制定了utf8mb4,可以看下实际的表数据
    在这里插入图片描述

    成功入库,这个时候如果你用到的缓存表来缓存数据,记得在执行下

    python manager.py createcachetable
    python manager.py runserver
    

    迁移成功,能看到我之前的博客网站数据都正常,而且也能登录,搞定。那么到时候部署到服务器,也是一样的操作

    参考文章:
    SQL查询语句相关模糊搜索
    修改root密码
    优雅的忘记密码
    MySQL安装
    官网忘记密码介绍
    django2.2/mysql ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3
    mysql时区查询
    mysql时区导入
    数据库迁移中文资料
    COLLATE和utf8mb4
    Python3出现"No module named ‘MySQLdb’"问题-以及使用PyMySQL连接数据库

    展开全文
  • 一开始测试的时候用的都是默认的设置,使用的是自带的sqlite的数据库,考虑到长远的使用来说,使用mysql更好一点,也方便操作,因此必需迁移之前的数据到mysql上面。 先从当前服务中导出数据: superset export_data...

    一开始测试的时候用的都是默认的设置,使用的是自带的sqlite的数据库,考虑到长远的使用来说,使用mysql更好一点,也方便操作,因此必需迁移之前的数据到mysql上面。

    先从当前服务中导出数据:
    superset export_datasources -b -d  -f datasources.yaml
    superset export_dashboards -f dashboards.json
    
    • 然后修改superset的配置文件,将sqlite源注释掉,添加mysql数据源,如下图所示。
      记得要先在mysql中创建superset数据库。
      关于如何找到superset的主配置文件,参见我的另一篇文章:
      https://blog.csdn.net/weixin_39358657/article/details/105115477
    / SQLALCHEMY_DATABASE_URI   # 查找数据库配置项
    
    # The SQLAlchemy connection string.
    SQLALCHEMY_DATABASE_URI = 'mysql://数据库账号:数据库密码@localhost/数据库名?charset=UTF8'
    # 把原来的sqlite注释掉
    # SQLALCHEMY_DATABASE_URI = "sqlite:///" + os.path.join(DATA_DIR, "superset.db")
    # SQLALCHEMY_DATABASE_URI = 'mysql://myapp@localhost/myapp'
    # SQLALCHEMY_DATABASE_URI = 'postgresql://root:password@localhost/myapp'
    

    :wq 保存并退出

    在这里插入图片描述

    接下来就相当于重新安装了:
    # 重新初始化admin账号
    fabmanager create-admin --app superset
    
    # 初始化数据库
    superset db upgrade
    
    # 加载examples
    superset load_examples
    
    # 初始化
    superset init
    
    
    然后先别急着启动服务,还原一下数据
    superset import_datasources -p datasources.yaml
    superset import_dashboards -p dashboards.json
    

    感觉还是挺6的
    在这里插入图片描述

    最后就是启动服务了
    superset run -h 0.0.0.0 -p 8088
    

    然后浏览器输入 http://你的ip地址:8088/dashboard/list/
    就能够看到恢复的dashboard了
    在这里插入图片描述

    善后事项:

    需要修改原先的datasorce
    在这里插入图片描述
    之前连接的外部数据库也要重新输入密码连接一下
    在这里插入图片描述

    目前已知的缺陷:

    1、旧的用户无法恢复
    2、旧的角色也无法恢复
    3、旧的charts和dashbord,新账号无法编辑后直接保存,需要先更改所有者才行

    综合来说,如果不是已经有了较多的历史数据的话,还是建议从头开始比较好。

    展开全文
  • 如果你像我一样,安装owncloud时使用了默认的SQLite数据库,想迁移数据库到MySQL/MariaDB,可以参考如下步骤。 文章转载自How to migrate owncloud from SQLite to MySQL database,感谢作者Magesh Maruthamuthu的...
  • 将Django2中SQLite迁移到Mysql,折腾

    千次阅读 2018-08-17 16:06:24
    SQLiteStudio导出SQLite3中的...于是直接在mysql中重新建数据库,并修改Settings设置,连接到mysql中,直接执行数据库同步。 # python3 + Django 2.1 python manage.py migrate  报错,“No module named 'M...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 176
精华内容 70
关键字:

sqlite迁移到mysql

mysql 订阅