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
数据库引擎$ 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
在线帮助: 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,容易误导。
不断进步的技术,需要不断去学习。所学的东西,在实际使用中不断去回顾。最终变成属于自己一部分。
技术似一缕缕的菌丝,给个适合的环境就能茁壮成长。有一个遮风挡雨的地方,千万缕菌丝在此附着,思想随之生根发芽。