例12-1 MySql中查询学号前面2位为“17”、出生日期在” 1998-01-01”以后的、年龄大于等于21岁的学生,结果按出生日期降序排序。
Select sNo,sname,sex,dtbirthdate,year(now())-year(dtbirthdate) '年龄' from S where left(sNo,2)='17' and year(now())-year(dtbirthdate) >=21 and date_format(dtbirthdate,'%Y-%m-%d')>'1998-01-01' order by dtbirthdate desc;
结果:
使用了Navicat Premium数据库可视化软件
例12-2 Python查询MySQL数据表记录。
基本思路:游标(cursor)执行查询语句后,返回的是元组变量,可以通过元组的索引,访问查询的结果。
import pymysql
conn=pymysql.connect( # 建立链接
host='127.0.0.1',#我的IP地址
port=3306, # 不是字符串不需要加引号。
user='root',
password='123',
db='stock1',
charset='utf8')
cur = conn.cursor() # 定义游标
strSQL = "select * from s"
cur.execute(strSQL) # 执行SQL语句
rows = cur.fetchall() # 获取游标所有行记录,返回元组变量
print("学号ttt姓名tt年龄")
print("------------------------")
for r in rows: # 遍历元组
print ("%st%stt%s" % (r[0], r[1], r[2]))
cur.close() # 用完,立即关闭对象,先关游标,再关连接
conn.close()
结果:
例12-3 Python更新MySQL数据表记录。
基本思路:游标(cursor)执行更新SQL语句后,返回一个整数变量,表示影响记录的条数。但这还只是在数据缓冲区中,若要影响到数据库中,需要调用连接对象connection的commit()方法,进行提交;如果失败,就自动回滚rollback()。
import pymysql
conn = pymysql.connect(
host='127.0.0.1', port=3306, user='root', password='123', database='stock1', charset='utf8')
cursor = conn.cursor()# 获取一个光标
try:
sql = 'insert into S(SNo, Sname, Age, Sex, dtBirthDate) values(%s,%s,%s,%s,%s);'
data = [('19011103', '张三', 22,'m','1998-1-2'),
('19011102', '李四', 22,'f','1997-1-2'),
('19011101', '王五', 22,'m','1996-1-2')]
cursor.executemany(sql, data) # 拼接并执行sql语句
conn.commit()# 涉及写操作要注意提交
print("数据插入成功!影响行数:", cursor.rowcount)
except pymysql.Error as e:
conn.rollback(); print("插入错误!错误信息:", e.args[1])
cursor.close() ;
conn.close() # 关闭光标和连接
结果:
例12-4文件《股票日交易数据20120425.xls》收录了我国A股所有股票2012.04.25日的日交易数据,共3173条记录,如表所示。
各列含义:1)Symbol股票代码,2)Name股票名称,3) Date交易日期,
4)Open开盘价, 5)High最高价,6)Low 最低价,7)Close 收盘价,
8)Change1涨幅,9)Volume成交量(手), 10)Amount成交额(元),
11)TurnoverRate 换手率;
将excel中的内容全部导入数据库。
SQL建表:
CREATE TABLE smStock ( cStockNo char(8) not null, vcStockName varchar(20) not null, dcLTP decimal(14,6) not null default 0, dtUsertime datetime not null default now(), constraint smStock_pk primary key(cStockNo) ); CREATE TABLE trDay ( cStockNo char(8) not null, cDay datetime not null, mOpen real not null default 0, mHigh real not null default 0, mLow real not null default 0, mClose real not null default 0, iVol real not null default 0, mm real not null default 0, dcChange decimal(8,4) not null default 0, dcRate decimal(6,2) not null default 0, constraint trDay_pk primary key(cStockNo,cDay), constraint trDay_fk foreign key(cStockNo) references smStock(cStockNo) );
python将excel信息插入数据库:
import numpy as np;
import xlrd ;
import pymysql
from datetime import datetime
from xlrd import xldate_as_tuple
stock = xlrd.open_workbook(r"C:pythonFilespythonProject教材各章数据教材各章数据第12章数据股票日交易数据20120425.xls")
sheet = stock.sheet_by_index(0) # 通过索引获取sheet
rows = sheet.nrows # 获得E行数,cols=sheet.ncols 为获得列数
conn = pymysql.connect(host="127.0.0.1",user='root', password="featherP@ssw0rd", database='mytest')
cur = conn.cursor() # 创建游标对象
conn.begin() # 开始事务
for i in np.arange(1,rows):
row = sheet.row_values(i) # 获得第i 行,为 list
cStockNo = row[1].strip() # 股票代码
vcStockName = row[2] # 股票名称
sCell = row[3] # 交易日期
date = datetime(*xldate_as_tuple(sCell, 0)) # 处理日期型
cDay = date.strftime('%Y-%m-%d') #('%Y/%m/%d %H:%M:%S')
mOpen = str(row[4]) # 开盘价
mHigh = str(row[5]) # 最高价
mLow = str(row[6]) # 最低价
mClose = str(row[7]) # 收盘价
dcRate = str(row[8]) # 涨幅
iVol = str(row[9]) # 成交量(手)
mm = str(row[10]) # 成交额(元)
dcChange = str(row[11]) # 换手率
# ------------------ 先插入股票基本信息 -------------------------------------------------
sql="select cStockNo from smStock where cStockNo='"+cStockNo+"'"
cur.execute(sql) # 检查该股票信息是否已经在表中
n = cur.rowcount # 执行查询语句,返回的记录行数
if n == 0: # 若不在股票基本信息表中,则插入股票基本信息
sql = "insert into smStock(cStockNo,vcStockName)"
sql = sql + " values('"+cStockNo+"','"+vcStockName+"')"
cur.execute(sql) # 执行SQL语句
sql = "insert into trDay(cStockNo,cDay,mOpen,mHigh, mLow,"
sql = sql + "mClose,iVol,mm,dcChange,dcRate) values('"
sql = sql + cStockNo+"','"+cDay+"',"+mOpen+","+mHigh+","
sql = sql + mLow +","+ mClose+","+iVol+","+mm+","
sql = sql +dcChange+","+dcRate + ")"
cur.execute(sql) #---------------- 再插入股票日交易记录 --------------------------
try:
conn.commit() # 数据更新,最后一次性提交,否则不会保存到数据库中
print("一次性全部导入成功!")
except pymysql.Error as e:
conn.rollback()
print ("导入失败!错误信息:",e.args[1] )
cur.close()
conn.close()
结果:



