面面觀 | 使用python 鏈接數據庫,插入並查詢數據--link

1,將兩個docker 鏈接起來node

 

首先須要搭建環境: python

在alpine下面建立mariadb數據庫: mysql

http://blog.csdn.net/freewebsys/article/details/53540615 web

用戶名密碼是root。 sql

而後建立http的Python環境: docker

http://blog.csdn.net/freewebsys/article/details/53509676 數據庫

接下來作一個簡單數據查詢和插入操做。flask

 

2,python代碼:bash

main.pyapp

#!/usr/bin/python# -*- coding: utf-8 -*-from flask import Flaskimport MySQLdb app = Flask(__name__) mysql_host ="mysql"mysql_user = "root"mysql_pwd = "root"mysql_db_name = "demo"""" CREATE DATABASE `demo` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; CREATE TABLE `demo`.`user_info` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(200) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; """def query_db(sql):    db = MySQLdb.connect(mysql_host, mysql_user, mysql_pwd, mysql_db_name)    cur = db.cursor()    try:        cur.execute(sql)        result = cur.fetchall()    except:        print("error: sql:" + sql)    cur.close()    db.close()    return resultdef update_db(sql):    print(sql)    db = MySQLdb.connect(mysql_host, mysql_user, mysql_pwd, mysql_db_name)    cur = db.cursor()    try:        cur.execute(sql)    except:        print("error: sql:" + sql)    db.commit()    cur.close()    db.close()@app.route("/list")def list():    results = query_db(" select id,name from `demo`.`user_info` ")    out ="results:\n"    for result in results:        id = result[0]        name = result[1]        out += "id:" + str(id) + ",name:" + name +"\n"    return out@app.route("/add")def add():    sql = " insert ignore into `demo`.`user_info`(`name` ) values ('zhangsan') "    update_db(sql)    return "ok"if __name__ == "__main__":    app.run(host='0.0.0.0', port=5000)

 

 

代碼和以前的http沒有太大區別,只是增長了數據庫的查詢和插入操做。 

一共就有兩個url,一個list,查詢所有數據,一個add,寫死增長。

 

3,建立數據庫表

MySQL須要建立下數據庫和表:


CREATE DATABASE `demo` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;CREATE TABLE`demo`.`user_info` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`name` varchar(200) DEFAULT NULL,PRIMARY KEY(`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

這個user_info表一共就有兩個字段,一個id自增,一個是name字符串的。 

固然這個數據庫不在本地,是另外的一個Docker 容器。 

http在一個容器上面。

 

4,使用link鏈接起來

數據建立名稱叫mariadb。 

跑http。

 

docker run -d -p 5000:5000 --name py-http --link mariadb:mysql demo/py-http:1.0

 

 

特別注意這裏的–link 容器名:暱稱,而後對於py-http容器來講mysql就是暱稱了。 

能夠直接看下evn環境:

 

# docker exec -it py-http

bashbash-4.3# env

HOSTNAME=db7f7aba7c2f

MYSQL_ENV_MYSQL_ROOT_PASSWORD=root

MYSQL_ENV_MARIADB_VERSION=10.1.19+maria-1~jessie

MYSQL_ENV_GOSU_VERSION=1.7

MYSQL_PORT_3306_TCP_PORT=3306

MYSQL_ENV_MARIADB_MAJOR=10.1

MYSQL_PORT_3306_TCP=tcp://172.17.0.2:3306

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

PWD=/

TZ=Asia/Shanghai

SHLVL=1HOME=/root

MYSQL_NAME=/py-http/mysql

MYSQL_PORT_3306_TCP_PROTO=tcp

MYSQL_PORT_3306_TCP_ADDR=172.17.0.2

MYSQL_PORT=tcp://172.17.0.2:3306

_=/usr/bin/env

 

能夠看到,在py-http容器下面已經把mariadb容器的環境變量直接引入了。 

而且查看hosts:

# cat /etc/hosts

127.0.0.1       localhost ::1     localhost ip6-localhost ip6-loopback

fe00::0 ip6-localnet

ff00::0 ip6-mcastprefix

ff02::1 ip6-allnodes

ff02::2 ip6-allrouters

172.17.0.2      mysql 48bd5fbf3ddc mariadb

172.17.0.3      db7f7aba7c2f

 

能夠看到有了mysql變量的host了。 

在外部訪問:就說明測試成功。數據庫能插入查詢了。

 

# curl http://127.0.0.1:5000/add

ok[root@localhost http]# curl http://127.0.0.1:5000/list

results:

id:1,name:zhangsan

id:2,name:zhangsan

 

4,總結

 

docker設計的挺好的,每個容器雖然獨立,可是還能夠鏈接起來。 

這樣組成一個微服務的集羣。經過環境變量,把代碼和環境分離。 

保證測試環境,開發環境,線上環境的的一致。 

極大的方便了開發運維,link 命令也很是好使。

 

 新智雲官網www.enncloud.cn

相關文章
相關標籤/搜索