python3的flask工程数据库从SQLite迁移到MySQL

SQLite数据量比较小的时候确实蛮不错的,不过网站的话MySQL还是比较好。SQLAlchemy 数据库引擎能保证工程可以快速切换数据库源。 只要切换一下数据库链接就能完成切换,狗书上如是说。

既然说那么简单,开始动工切换数据库之旅!

环境:
debian 7.5 (x86)
python 3.5

实例工程是OReilly出版的《flask web 开发:基于Python的Web应用开发实战》。书中的环境是应该是以python2为基础的,python3也能正常使用。

工程获取: https://github.com/miguelgrinberg/flasky

按照书中的描述只要把数据库链接替换。

一、替换数据库链接

FLask-SQLAlchemy数据库URL

数据库引擎 URL
MySQL mysql://username:password@hostname/database
Postgres postgresql://username:password@hostname/database
SQLite(Unix) sqlite:////absolute/path/to/database
SQLite(Windows) sqlite:///c:/absolute/path/to/database
改:
MySQL(py3+pymysql) mysql+pymysql://moguf:moguf@localhost/icalc?charset=utf8

看上去确实简单。只要把URL改成MySQL的就OK了,实际Python3 会有些问题。要使用表中pymysql的连接样式。

二、安装部署MySQL

安装数据库

数据库直接使用系统提供的系统提供的版本(5.5)。

$ sudo apt-get install mysql-server

安装过程中会让你输入root密码,一路向下。

完成后可以使用 mysql --version 查看安装的版本信息。如下面的。

moguf@debian32:~$ mysql --version
mysql  Ver 14.14 Distrib 5.5.49, for debian-linux-gnu (i686) using readline 6.3

创建数据库

创建一个新的数据库icalc,用来保存站点数据。

moguf@debian32:~$ mysql -uroot -p
mysql> create database icalc character set utf8; 
mysql> grant all ON icalc.* TO 'moguf'@'localhost' identified by 'moguf';
mysql> flush privileges;
mysql> show databases;
mysql> exit

命令说明:
1、使用root用户打开数据库
2、创建一个icalc数据库,并使用utf8作为数据库的字符集。
3、创建一个moguf用户,密码:moguf,分配所有icalc数据库操作权限
4、提交所有修改
5、查看所有数据库名称(应该有建的icalc数据库)

这里须要注意一点,数据库要使用utf8字符集。否则呵呵~~你中文就会变成????

注意:数据库字符集使用utf8

如果创建时没带参数可以使用alter database命令修改数据库字符集

mysql> alter database mydb character set utf8;

修改后查看字符集设置

mysql> show variables like 'collation_%';
mysql> show variables like 'character_set_%';

歪歪一下授权语法,方便参考

简易记忆:
grant
权限 on 应用范围(数据库表,方法等) to '用户名'@'主机名' identified by 密码
require 要求 with 对用户的进行的执行sql的条数控制。

最后 require 和 with 可以细节空值

样例:

//test用户拥有test数据库下的所有操作  
grant all ON test.* TO 'test'@'localhost';     

//test用户可以对test数据库下user表,进行查找和更新操作  
grant select,update on test.user to 'test'@'localhost';    

//test用户的的密码是111111,对user表中的name字段有读取权限,对id,name有更新权限  
grant select(name),update(id,name) on test.user to 'test'@'localhost' identified by '111111';  

//test用户对所有数据库拥有所有权力,并且要求ssl加密  
grant all privileges on *.* to 'test'@'%' identified by '123456' require ssl

修改root密码

如果安装的时候没设置密码。如在mac中使用dmg安装时没有设置过密码。新建数据库可能会提示权限问题。可以修改root的密码后使用root重新登录。

用SET PASSWORD命令

$ mysql -u root
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass');
mysql> flush privileges;
mysql> exit

然后用设置的密码重新登录mysql,创建数据库

$ mysql -uroot -p

测试数据库

使用新建的用户连接

moguf@debian32:~$ mysql -umoguf -pmoguf
mysql> use icalc;
mysql> CREATE TABLE test (id int);
mysql> insert into test(id) values(100);
mysql> select * from test;
+------+
| id   |
+------+
|  100 |
+------+
1 row in set (0.00 sec)

mysql> drop table test;
mysql> show tables;
Empty set (0.00 sec)

mysql> exit

使用新用户对新数据库,进行简答操作OK。环境OK下面就是正题。

三、安装python3的MySQL包PyMySQL

提示:
国内pip的数据源安装比较慢,可以用国内镜像。加参数 -i https://pypi.douban.com/simple 使用豆瓣的源
《Debian安装 python 3.5.1》 有pip源配置的说明

(venv)$ pip install mysql

安装python mysql包时会出现错误,无法正确安装。会出现下面的情况。

(venv) moguf@debian32:~/icalc$ pip install mysql
Collecting mysql
  Downloading mysql-0.0.1.tar.gz
Collecting MySQL-python (from mysql)
  Downloading MySQL-python-1.2.5.zip (108kB)
    100% |████████████████████████████████| 112kB 77kB/s
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-build-uu5m0ybb/MySQL-python/setup.py", line 13, in <module>
        from setup_posix import get_config
      File "/tmp/pip-build-uu5m0ybb/MySQL-python/setup_posix.py", line 2, in <module>
        from ConfigParser import SafeConfigParser
    ImportError: No module named 'ConfigParser'

    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-uu5m0ybb/MySQL-python/

查资料才发现python3不支持mysql-python的包。ConfigParser 这个包已经改成了configparser 小写字母的。

PyMySQL 替代 MySQL-python

PyMySQL 支持 python3 ,可以进行替代。

(venv)$ pip install PyMySQL

安装成功!!

四、修改配置

打开config.py 把开发的链接修改成MySQL链接。

URL: mysql+pymysql://moguf:moguf@localhost/icalc?charset=utf8

class DevelopmentConfig(Config):
    DEBUG = True
    SQLALCHEMY_DATABASE_URI = os.environ.get('ICALC_DEV_DATABASE_URL') or \
        'mysql+pymysql://moguf:moguf@localhost/icalc?charset=utf8'

使用部署命令生成数据库

(venv)$ python manage.py deploy

没报错,恭喜离成功一步之遥!

相关问题

如果使用狗书上的链接方式会出现无法加载MySQLdb的模块包

mysql://moguf:moguf@localhost/icalc

会出现下面的问题,是应为使用PyMySQL代替了没有MySQLdb这个包。

... ...
    return __import__('MySQLdb')
ImportError: No module named 'MySQLdb'
(venv) moguf@debian32:~/icalc$

五、运行站点测试

启动站点

(venv) $ python manage.py runserver

在本地访问你的服务器,可以在浏览器上看到网站内容。

恭喜成功了!

六、相关参考

实际SQLAlchemy支持很多MySQL的引擎,不仅仅只有PyMySQL,具体可以参考在线帮助。

DBAPI Support URL
MySQL-Python mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>
PyMySQL mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]
MySQL Connector/Python mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>
CyMySQL mysql+cymysql://<username>:<password>@<host>/<dbname>[?<options>]
OurSQL mysql+oursql://<user>:<password>@<host>[:<port>]/<dbname>
Google Cloud SQL mysql+gaerdbms:///<dbname>?instance=<instancename>
PyODBC mysql+pyodbc://<username>:<password>@<dsnname>
zxjdbc for Jython mysql+zxjdbc://<user>:<password>@<hostname>[:<port>]/<database>

在线帮助: SQLAlchemy 1.0 Documentation http://docs.sqlalchemy.org/en/rel_1_0/dialects/mysql.html#dialect-mysql

实际的部署看下面帖子的方案

部署贴: 《Debian下使用Nginx+uWSGI部署Flask应用》 把里面sqlite的替换成MySQL就可以了。

安装python3看 《Debian安装 python 3.5.1》 帖子

总结:
1、数据库字符集一定要改成 UTF8,否则会出现乱码
2、Python3下MySQL-Python不支持须要使用其它数据库API

弄明白了切换数据库确实很简单的,就是很多网上的帖子没提示是Python2还是Python3,容易误导。