- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章在Python程序中操作MySQL的基本方法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
Python操作Mysql 。
最近在学习python,这种脚本语言毫无疑问的会跟数据库产生关联,因此这里介绍一下如何使用python操作mysql数据库。我python也是零基础学起,所以本篇博客针对的是python初学者,大牛可以选择绕道.
另外,本篇基于的环境是Ubuntu13.10,使用的python版本是2.7.5。 MYSQL数据库 。
MYSQL是一个全球领先的开源数据库管理系统。它是一个支持多用户、多线程的数据库管理系统,与Apache、PHP、Linux共同组成LAMP平台,在web应用中广泛使用,例如Wikipedia和YouTube。MYSQL包含两个版本:服务器系统和嵌入式系统。 环境配置 。
在我们开始语法学习之前,还需要按装mysql和python对mysql操作的模块.
安装mysql
1
|
sudo
apt-get
install
mysql-server
|
安装过程中会提示你输入root帐号的密码,符合密码规范即可.
接下来,需要安装python对mysql的操作模块:
1
|
sudo
apt-get
install
python-mysqldb
|
这里需要注意:安装完python-mysqldb之后,我们默认安装了两个python操作模块,分别是支持C语言API的_mysql和支持Python API的MYSQLdb。稍后会重点讲解MYSQLdb模块的使用.
接下来,我们进入MYSQL,创建一个测试数据库叫testdb。创建命令为:
1
|
create
database
testdb;
|
然后,我们创建一个测试账户来操作这个testdb数据库,创建和授权命令如下:
1
2
3
4
|
create
user
'testuser'
@
'127.0.0.1'
identified
by
'test123'
;
grant
all
privileges
on
testdb.*
to
'testuser'
@
'127.0.0.1'
;
_mysql module
|
_mysql模块直接封装了MYSQL的C语言API函数,它与python标准的数据库API接口是不兼容的。我更推荐大家使用面向对象的MYSQLdb模块才操作mysql,这里只给出一个使用_mysql模块的例子,这个模块不是我们学习的重点,我们只需要了解有这个模块就好了.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#!/usr/bin/python
# -*- coding: utf-8 -*-
import
_mysql
import
sys
try
:
con
=
_mysql.connect(
'127.0.0.1'
,
'testuser'
,
'test123'
,
'testdb'
)
con.query(
"SELECT VERSION()"
)
result
=
con.use_result()
print
"MYSQL version : %s "
%
result.fetch_row()[
0
]
except
_mysql.Error, e:
print
"Error %d: %s %s"
%
(e.args[
0
], e.args[
1
])
sys.exit(
1
)
finally
:
if
con:
con.close()
|
这个代码主要是获取当前mysql的版本,大家可以模拟敲一下这部分代码然后运行一下。 MYSQLdb module 。
MYSQLdb是在_mysql模块的基础上进一步进行封装,并且与python标准数据库API接口兼容,这使得代码更容易被移植。Python更推荐使用这个MYSQLdb模块来进行MYSQL操作.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#!/usr/bin/python
# -*- coding: utf-8 -*-
import
MySQLdb as mysql
try
:
conn
=
mysql.connect(
'127.0.0.1'
,
'testuser'
,
'test123'
,
'testdb'
)
cur
=
conn.cursor()
cur.execute(
"SELECT VERSION()"
)
version
=
cur.fetchone()
print
"Database version : %s"
%
version
except
mysql.Error, e:
print
"Error %d:%s"
%
(e.args[
0
], e.args[
1
])
exit(
1
)
finally
:
if
conn:
conn.close()
|
我们导入了MySQLdb模块并把它重命名为mysql,然后调用MySQLdb模块的提供的API方法来操作数据库。同样也是获取当前主机的安装的mysql版本号。 创建新表 。
接下来,我们通过MySQLdb模块创建一个表,并在其中填充部分数据。实现代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#!/usr/bin/python
# -*- coding: utf-8 -*-
import
MySQLdb as mysql
conn
=
mysql.connect(
'127.0.0.1'
,
'testuser'
,
'test123'
,
'testdb'
);
with conn:
cur
=
conn.cursor()
cur.execute(
"DROP TABLE IF EXISTS writers"
);
cur.execute(
"CREATE TABLE writers(id INT PRIMARY KEY AUTO_INCREMENT, name varchar(25))"
)
cur.execute(
"insert into writers(name) values('wangzhengyi')"
)
cur.execute(
"insert into writers(name) values('bululu')"
)
cur.execute(
"insert into writers(name) values('chenshan')"
)
|
这里使用了with语句。with语句会执行conn对象的enter()和__exit()方法,省去了自己写try/catch/finally了.
执行完成后,我们可以通过mysql-client客户端查看是否插入成功,查询语句:
1
|
select
*
from
writers;
|
查询结果如下:
查询数据 。
刚才往表里插入了部分数据,接下来,我们从表中取出插入的数据,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#!/usr/bin/python
import
MySQLdb as mysql
conn
=
mysql.connect(
'127.0.0.1'
,
'testuser'
,
'test123'
,
'testdb'
);
with conn:
cursor
=
conn.cursor()
cursor.execute(
"select * from writers"
)
rows
=
cursor.fetchall()
for
row
in
rows:
print
row
|
查询结果如下:
1
2
3
|
(1L, 'wangzhengyi')
(2L, 'bululu')
(3L, 'chenshan')
|
dictionary cursor 。
我们刚才不论是创建数据库还是查询数据库,都用到了cursor。在MySQLdb模块有许多种cursor类型,默认的cursor是以元组的元组形式返回数据的。当我们使用dictionary cursor时,数据是以python字典形式返回的。这样我们就可以通过列名获取查询数据了.
还是刚才查询数据的代码,改为dictionary cursor只需要修改一行代码即可,如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#!/usr/bin/python
import
MySQLdb as mysql
conn
=
mysql.connect(
'127.0.0.1'
,
'testuser'
,
'test123'
,
'testdb'
);
with conn:
cursor
=
conn.cursor(mysql.cursors.DictCursor)
cursor.execute(
"select * from writers"
)
rows
=
cursor.fetchall()
for
row
in
rows:
print
"id is %s, name is %s"
%
(row[
'id'
], row[
'name'
])
|
使用dictionary cursor,查询结果如下:
1
2
3
|
id is 1, name is wangzhengyi
id is 2, name is bululu
id is 3, name is chenshan
|
预编译 。
之前写过php的同学应该对预编译很了解,预编译可以帮助我们防止sql注入等web攻击还能帮助提高性能。当然,python肯定也是支持预编译的。预编译的实现也比较简单,就是用%等占位符来替换真正的变量。例如查询id为3的用户的信息,使用预编译的代码如下:
1
2
3
4
5
6
7
8
9
10
11
|
#!/usr/bin/python
import
MySQLdb as mysql
conn
=
mysql.connect(
'127.0.0.1'
,
'testuser'
,
'test123'
,
'testdb'
);
with conn:
cursor
=
conn.cursor(mysql.cursors.DictCursor)
cursor.execute(
"select * from writers where id = %s"
,
"3"
)
rows
=
cursor.fetchone()
print
"id is %d, name is %s"
%
(rows[
'id'
], rows[
'name'
])
|
我这里使用了一个%s的占位符来替换“3”,代表需要传入的是一个字符串类型。如果传入的不是string类型,则会运行报错。 事务 。
事务是指在一个或者多个数据库中对数据的原子操作。在一个事务中,所有的SQL语句的影响要不就全部提交到数据库,要不就全部都回滚.
对于支持事务机制的数据库,python接口在创建cursor的时候就开始了一个事务。可以通过cursor对象的commit()方法来提交所有的改动,也可以使用cursor对象的rollback方法来回滚所有的改动.
我这里写一个代码,对不存在的表进行插入操作,当抛出异常的时候,调用rollback进行回滚,实现代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#!/usr/bin/python
# -*- coding: utf-8 -*-
import
MySQLdb as mysql
try
:
conn
=
mysql.connect(
'127.0.0.1'
,
'testuser'
,
'test123'
,
'testdb'
);
cur
=
conn.cursor()
cur.execute(
"insert into writers(name) values('wangzhengyi4')"
)
cur.execute(
"insert into writers(name) values('bululu5')"
)
cur.execute(
"insert into writerss(name) values('chenshan6')"
)
conn.commit()
except
mysql.Error, e:
if
conn:
conn.rollback()
print
"Error happens, rollback is call"
finally
:
if
conn:
conn.close()
|
。
执行结果如下:
1
|
Error happens, rollback is call
|
因为前两条数据是正确的插入操作,但是因为整体回滚,所以数据库里也没有wangzhengyi4和bululu5这两个数据的存在.
最后此篇关于在Python程序中操作MySQL的基本方法的文章就讲到这里了,如果你想了解更多关于在Python程序中操作MySQL的基本方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在努力做到这一点 在我的操作中从数据库获取对象列表(确定) 在 JSP 上打印(确定) 此列表作为 JSP 中的可编辑表出现。我想修改然后将其提交回同一操作以将其保存在我的数据库中(失败。当我使用
我有以下形式的 Linq to Entities 查询: var x = from a in SomeData where ... some conditions ... select
我有以下查询。 var query = Repository.Query() .Where(p => !p.IsDeleted && p.Article.ArticleSections.Cou
我正在编写一个应用程序包,其中包含一个主类,其中主方法与GUI类分开,GUI类包含一个带有jtabbedpane的jframe,它有两个选项卡,第一个选项卡包含一个jtable,称为jtable1,第
以下代码产生错误 The nested query is not supported. Operation1='Case' Operation2='Collect' 问题是我做错了什么?我该如何解决?
我已经为 HA redis 集群(2 个副本、1 个主节点、3 个哨兵)设置了本地 docker 环境。只有哨兵暴露端口(10021、10022、10023)。 我使用的是 stackexchange
我正在 Desk.com 中构建一个“集成 URL”,它使用 Shopify Liquid 模板过滤器语法。对于开始日期为 7 天前而结束日期为现在的查询,此 URL 需要包含“开始日期”和“结束日期
你一定想过。然而情况却不理想,python中只能使用类似于 i++/i--等操作。 python中的自增操作 下面代码几乎是所有程序员在python中进行自增(减)操作的常用
我需要在每个使用 github 操作的手动构建中显示分支。例如:https://gyazo.com/2131bf83b0df1e2157480e5be842d4fb 我应该显示分支而不是一个。 最佳答
我有一个关于 Perl qr 运算符的问题: #!/usr/bin/perl -w &mysplit("a:b:c", /:/); sub mysplit { my($str, $patt
我已经使用 ArgoUML 创建了一个 ERD(实体关系图),我希望在一个类中创建两个操作,它们都具有 void 返回类型。但是,我只能创建一个返回 void 类型的操作。 例如: 我能够将 book
Github 操作仍处于测试阶段并且很新,但我希望有人可以提供帮助。我认为可以在主分支和拉取请求上运行 github 操作,如下所示: on: pull_request push: b
我正在尝试创建一个 Twilio 工作流来调用电话并记录用户所说的内容。为此,我正在使用 Record,但我不确定要在 action 参数中放置什么。 尽管我知道 Twilio 会发送有关调用该 UR
我不确定这是否可行,但值得一试。我正在使用模板缓冲区来减少使用此算法的延迟渲染器中光体积的过度绘制(当相机位于体积之外时): 使用廉价的着色器,将深度测试设置为 LEQUAL 绘制背面,将它们标记在模
有没有聪明的方法来复制 和 重命名 文件通过 GitHub 操作? 我想将一些自述文件复制到 /docs文件夹(:= 同一个 repo,不是远程的!),它们将根据它们的 frontmatter 重命名
我有一个 .csv 文件,其中第一列包含用户名。它们采用 FirstName LastName 的形式。我想获取 FirstName 并将 LastName 的第一个字符添加到它上面,然后删除空格。然
Sitecore 根据 Sitecore 树中定义的项目名称生成 URL, http://samplewebsite/Pages/Sample Page 但我们的客户有兴趣降低所有 URL(页面/示例
我正在尝试进行一些计算,但是一旦我输入金额,它就会完成。我只是希望通过单击按钮而不是自动发生这种情况。 到目前为止我做了什么: Angular JS - programming-fr
我的公司创建了一种在环境之间移动文件的复杂方法,现在我们希望将某些构建的 JS 文件(已转换和缩小)从一个 github 存储库移动到另一个。使用 github 操作可以实现这一点吗? 最佳答案 最简
在我的代码中,我创建了一个 JSONArray 对象。并向 JSONArray 对象添加了两个 JSONObject。我使用的是 json-simple-1.1.jar。我的代码是 package j
我是一名优秀的程序员,十分优秀!