说明:
本文献给对数据库毫无基础而又需要利用数据库做一些事情的同学,需要注意的是下文并不涉及数据库的创建。
连接到数据库
为了在python程序中使用数据库,我们首先需要安装必要的包。
python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple mysql-connector
注意-i
及之后的语句是为了使用国内的镜像,加快下载速度。安装完成后,可以在ipython
中import mysql.connector
,如果没有出现错误则说明安装成功。
安装完成后我们要连接到一个数据库,连接的方式很简单
mydb = mysql.connector.connect(
host = "xxx.xx.xx.xxx",
port = "xxxx",
user = "xxxxx",
passwd = "xxxxx",
)
注意以上信息都可以从创建该数据库的人那里得到。如果你只是一个使用者,则完全不必担心上面的信息。要注意的一点是port
代表端口号,是可以省略的,此时为默认值3306
,如果不是才需要注明。
在连接好了以后,可以使用
mycursor = mydb.cursor()
mycursor.execute("SHOW DATABASES")
for x in mycursor:
print(x)
来查看存在哪些数据库。假设其中存在一个名为ndpi
的数据库,则可以将其添加到上面的列表中。
mydb = mysql.connector.connect(
host = "xxxxxxxx",
port = "xxxx",
user = "xxxxxx",
passwd = "xxxxxx",
database = "ndpi"
)
这样以来,就连接到了该数据库。
创建数据表
如果之前没有使用过数据库,很可能不敢贸然操作,这时我们可以创建一个新的数据表作为实验。
mycursor.execute("CREATE TABLE test (id INT, name VARCHAR(255))")
上面的语句创建了一个只有两列的数据表。
id | name |
---|
其中id
是整型,而name
是字符串。注意这里的指定非常重要,后面我们会看到在插入信息时是无法指定的。
插入信息
sql = "INSERT INTO test (id, path) VALUES (%s, %s)"
val = ("001", "wenzi")
mycursor.execute(sql, val)
mydb.commit()
print(mycursor.rowcount, "success")
以上语句在test
表中插入一个姓名为wenzi
,id为001
的信息。虽然id
是整型,但是这里的占位符只能使用%s
,而不能习惯性的使用%d
。整型和字符型的区别在查询时会体现出来。
删除信息
sql = "DELETE FROM test WHERE id = '001'"
mycursor.execute(sql)
mydb.commit()
print(mycursor.rowcount, "delete")
注意这里的WHERE条件,它指明删除id
为001
的数据。
删除数据表
sql = "DROP TABLE IF EXISTS test"
mycursor.execute(sql)
### 查询
对于使用数据库而不需进行管理的人来说,查询可能是最为重要的工作了。在这里我们只介绍一种最简单,但是常见的教程似乎都没有给出的情况。
假设现在的任务是给定一个```id```,我们需要将姓名查找出来,
```python
sql = "SELECT * FROM test WHERE id = '001'"
mycursor.execute(sql)
myresult = mycursor.fetchone()
此时得到的myresult
是一个tuple
。可以像通常的元组那样进行操作。要注意的是,其中的字符串都是bytearray
,如果想要将其转化为常见的字符串,可以使用如下方法。
name = myresult[1].decode('utf-8')
如果满足条件的不止一项,则可以使用
myresult = mycursor.fetchall()
for x in myresult:
print(x)
下面的问题在于,假如我们需要查询的条件是不固定的。比如在一个函数中,我们传入一个data_id
,然后根据它去查找相应的姓名。以下的代码是错误的
sql = "SELECT * FROM test WHERE id = data_id"
or
sql = "SELECT * FROM test WHERE id = 'data_id'"
不管是数值还是字符串,以上写法都不能得到正确的答案。经过试验,不管数据表中的id
为字符串还是数值,都可以使用如下方法
sql = "SELECT * FROM test WHERE id = '"+data_id+"'"