Python与数据库

说明:

本文献给对数据库毫无基础而又需要利用数据库做一些事情的同学,需要注意的是下文并不涉及数据库的创建。

连接到数据库

为了在python程序中使用数据库,我们首先需要安装必要的包。

python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple mysql-connector

注意-i及之后的语句是为了使用国内的镜像,加快下载速度。安装完成后,可以在ipythonimport 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条件,它指明删除id001的数据。

删除数据表

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+"'"

你可能感兴趣的:(Python与数据库)