docker(7):使用python 连接数据库,插入并查询数据--link

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/53589604 未经博主允许不得转载。 博主地址是:http://blog.csdn.net/freewebsys1,将两个docker 连接起来首先需要搭建环境: 在alpine下面创建mariadb数据库: http://blo

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/53589604 未经博主允许不得转载。
博主地址是:http://blog.csdn.net/freewebsys

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 Flask
import 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 result

def 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 bash
bash-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=1
HOME=/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,总结


本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/53589604 未经博主允许不得转载。
博主地址是:http://blog.csdn.net/freewebsys

docker设计的挺好的,每一个容器虽然独立,但是还可以连接起来。
这样组成一个微服务的集群。通过环境变量,把代码和环境分离。
保证测试环境,开发环境,线上环境的的一致。
极大的方便了开发运维,link 命令也非常好使。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
14天前
|
存储 SQL 监控
Visual Basic与数据库交互:实现数据访问和管理
【4月更文挑战第27天】本文探讨了使用Visual Basic进行数据库编程的基础,包括数据库基础、连接、数据访问技术如ADO.NET,数据绑定,事务处理,存储过程与视图。还强调了性能优化、安全性、测试与调试,以及持续维护的重要性。通过掌握这些概念和技巧,开发者能构建高效、可靠的数据驱动应用。
|
11天前
|
DataWorks Oracle 关系型数据库
DataWorks操作报错合集之尝试从Oracle数据库同步数据到TDSQL的PG版本,并遇到了与RAW字段相关的语法错误,该怎么处理
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
29 0
|
1天前
|
Oracle Java 关系型数据库
【服务器】python通过JDBC连接到位于Linux远程服务器上的Oracle数据库
【服务器】python通过JDBC连接到位于Linux远程服务器上的Oracle数据库
13 6
|
1天前
|
Shell 数据安全/隐私保护 Docker
docker安装anaconda3 python环境
docker安装anaconda3 python环境
|
4天前
|
NoSQL 关系型数据库 数据库
数据库同步 Elasticsearch 后数据不一致,怎么办?
数据库同步 Elasticsearch 后数据不一致,怎么办?
9 0
|
4天前
|
存储 数据管理 数据安全/隐私保护
【Docker专栏】Docker存储卷管理:数据持久化的关键
【5月更文挑战第7天】本文探讨了Docker容器中数据持久化的关键——存储卷,包括其独立于容器生命周期的特性、数据共享与迁移能力。Docker提供默认、命名、数据卷容器和挂载宿主机目录四种卷类型。创建与管理涉及`docker volume create`、`ls`、`run`等命令。最佳实践建议使用命名存储卷,定期备份,避免存储敏感数据,并清理未使用卷。了解和有效管理存储卷能提升容器灵活性和数据管理效率。
【Docker专栏】Docker存储卷管理:数据持久化的关键
|
10天前
|
SQL 关系型数据库 MySQL
【MySQL-1】理解关系型数据库&数据的数据模型
【MySQL-1】理解关系型数据库&数据的数据模型
|
12天前
|
分布式计算 DataWorks 关系型数据库
DataWorks产品使用合集之在使用 DataWorks 数据集成同步 PostgreSQL 数据库中的 Geometry 类型数据如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
23 0
|
12天前
|
Java 关系型数据库 MySQL
【JDBC编程】基于MySql的Java应用程序中访问数据库与交互数据的技术
【JDBC编程】基于MySql的Java应用程序中访问数据库与交互数据的技术
|
2天前
|
JSON 数据格式 开发者
pip和requests在Python编程中各自扮演着不同的角色
`pip`是Python的包管理器,用于安装、升级和管理PyPI上的包;`requests`是一个HTTP库,简化了HTTP通信,支持各种HTTP请求类型及数据交互。两者在Python环境中分别负责包管理和网络请求。
13 5