python怎么连接数据库
1、1,将两个docker 连接起来
首先需要搭建环境:
在alpine下面创建mariadb数据库:
https://blog.csdn.net/freewebsys/article/details/53540615
用户名密码是root。
然后创建http的python环境:
https://blog.csdn.net/freewebsys/article/details/53509676
接下来做一个简单数据查询和插入操作。
2、2,python代码:
main.py
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#!/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需要创建下数据库和表:
?
1
2
3
4
5
6
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、4,使用link连接起来
数据创建名称叫mariadb。
跑http。
?
1
docker run -d -p 5000:5000 --name py-http --link mariadb:mysql demo/py-http:1.0
特别注意这里的–link 容器名:昵称,然后对于py-http容器来说mysql就是昵称了。
可以直接看下evn环境:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 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:
?
1
2
3
4
5
6
7
8
9
# 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了。在外部访问:就说明测试成功。数据库能插入查询了。
?
1
2
3
4
5
# curl https://127.0.0.1:5000/add
ok[root@localhost http]# curl https://127.0.0.1:5000/list
results:
id:1,name:zhangsan
id:2,name:zhangsan