每到深夜,打开音乐,带上耳机,周围很安静,只有到这个时候我才感觉到自己是一个学者,而此刻头脑中只有两件事罢了:1.记下今天所用到的知识 2.安安静静听歌
最近做一个python获取考勤数据的小脚本,一直没有怎么用到数据库,今天就来探讨一下获取数据库的返回值

1.关于数据库返回值的讨论
2.fetchall(),fetchone()
3.python连接各类数据库教程

1.关于数据库返回值的讨论

1.1.构造简单sql语句

假设存在这样一个简单的数据库,获取每一行的数据,并保存为txt格式

构造sql语句

select * from dbo.userlist where user_serial<100010

1.2.python连接数据库(SQL server)

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
# -*- coding:utf-8 -*-
import pymssql
# 获取考勤系统数据

def demo():
server = ""
user = ""
password = ""
database = ""
conn = pymssql.connect(
server=server,
user=user,
password=password,
database=database
)
# 创建游标
cursor = conn.cursor()
# 构造查询sql语句
sql ="select * from dbo.kt_dev where user_serial<100010"
cursor.execute(sql)
numbers = cursor.fetchall()
print(numbers[0]) # 元组(100002, '0010014', '00101')
print(type(numbers[0])) # tuple元组类型
# 元组访问方式与拼接
print(str(str(numbers[1][0]))+":"+str(numbers[1][1])) # 100002:0010002
print(type(numbers)) # list 列表
print('总列表:',numbers)
cursor.execute(sql)
loan_count = 0
# 获取所有的查询数据(1.区别于fetchone() 2.fetchall/fetchone()的返回值均为元组型列表,即[(第一行数据),(第二行数据),...()])

with open("test_demo.txt",'a+',encoding='utf-8') as f:
for number in numbers:
f.write(str(number[0])+" "+str(number[1]) + " "+str(number[2]+"\n")) # 元组数据number=("考勤卡号”,"刷卡时间")
loan_count += 1
# 断开连接
cursor.close()
conn.close()
print("写入完成,共写入%d条数据!" % loan_count)
if __name__ == '__main__':
demo()

数据库查询后返回的所有数据

1
2
# 总列表: 
[(100002, '0010014', '00101'), (100002, '0010002', '00101'),..., (100006, '0010014', '00101')]

由上式案列可知:

1.fetchall():表示返回查询到的所有数据;fetchone():表示返回查询到的第一行数据
2.python查询返回的所有数据类型为元组型列表,即[(),(),...()]
3.元组的访问方式为:元组名[index]

1.3 字典型的数据库返回值

思考: 由上述推论可知无论是fetchall,还是fetchone,返回的数据都是元祖型列表,即我们不能通过键名(即数据库的字段名),只能使用索引。
这时就出现了一个问题:如果数据库的字段很多,难道要一个个数过去,找到其对应的索引值,这太麻烦了。思考一下,能不能返回的是字典型列表,便可用数据库的字段名作为键名,十分方便。

oracle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import cx_Oracle
import os


connection = cx_Oracle.connect("Booker", "123456", "172.18.240.31:1521/Book")
# 创建游标
cursor = connection.cursor()
# 执行sql
cursor.execute("select * from book")
# 获取返回值
a = cursor.fetchall()
cols = [d[0] for d in cursor.description]
print(cols)
for row in a:
b = dict(zip(cols, row))
print(b['book_name'])
cursor.close()
connection.close()

这样我们就可以使用b[‘字段名’]的方式进入各种操作了,又清晰又方便。

mysql

想返回字典格式,只需要在建立游标的时候加个参数,cursor=pymysql.cursors.DictCursor。这样每行返回的值放在字典里面,然后整体放在一个list里面

1
2
3
4
5
6
7
8
9
import pymysql
def export(table_name):
conn =pymysql.connect(host = '118.24.3.40',
user = 'jxz',password='123456',
db='jxz',port=3306,charset = 'utf8')
cur = conn.cursor(cursor=pymysql.cursors.DictCursor)
cur.execute('select * from %s'%table_name)
print(cur.fetchall())
export('app_student')

2.python连接各类数据库教程

【python连接各类数据库教程】
【Python连接Oracle数据库,以字典形式返回结果】
【python操作mysql数据-执行语句返回值直接返回字典类型】


 评论

联系我 | Contact with me

Copyright © 2019-2020 谁知你知我,我知你知深。此恨经年深,比情度日久

博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议