• 面面观 | 使用python 连接数据库,插入并查询数据--link


    1,将两个docker 连接起来

    首先需要搭建环境: 

    在alpine下面创建mariadb数据库: 

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

    用户名密码是root。 

    然后创建http的Python环境: 

    http://blog.csdn.net/freewebsys/article/details/53509676 

    接下来做一个简单数据查询和插入操作。

    2,python代码:

    main.py

    #!/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: "    for result in results:        id = result[0]        name = result[1]        out += "id:" + str(id) + ",name:" + name +" "    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

  • 相关阅读:
    [Redis-CentOS7]Redis设置连接密码(九)
    [Redis-CentOS7]Redis数据持久化(八)
    PAT Advanced 1101 Quick Sort (25分)
    PAT Advanced 1043 Is It a Binary Search Tree (25分)
    HTTP协议
    PAT Advanced 1031 Hello World for U (20分)
    自然码双拼快速记忆方案
    macOS 原生输入法设置自然码
    PAT Advanced 1086 Tree Traversals Again (25分)
    PAT Advanced 1050 String Subtraction (20分)
  • 原文地址:https://www.cnblogs.com/enncloudcn/p/6934706.html
Copyright © 2020-2023  润新知