在上一篇
中,我实现了设置按钮的功能,其中涉及到了从数据库中读写数据。我使用的是SQLite数据库,这是一种轻量级的基于单一磁盘文件的关系数据库,不需要单独的服务器即可使用。从2.5版本开始,Python已经集成了SQLite模块(模块名:sqlite3),所以对于天气预报这种小型程序来说,用SQLite那可是相当方便。本文出自三思之旅博客http://think3t.iteye.com,转载请注明出处。
本篇简单介绍一下Python如何操纵SQLite数据库。注意,我讲的重点是Python操纵SQLite,而不是讲数据库的。因为SQLite也是一种关系型数据,常用的SQL语句都支持,所以本文不再赘述。
Python操纵SQLite数据库,可以分为如下几步:
- 连接数据库
- 建立游标
- 执行SQL命令
- 获取查询结果(仅查询需要)
- 提交当前事务(查询不需要)
- 关闭数据库连接
先说一下本程序用到的数据库。本人对SQL语句也不是很懂,所以程序中只是进行查询、增加条目、删除条目、更改条目的操作,没有建表、删表的操作,表是我事先通过图形界面的SQLite数据库浏览器建的。数据库中一共两个表————cityInfo和userInfo。cityInfo中存储的是全国各省市县区的信息,一共4个字段,依次是id(城市代码)、prov(省)、city(市)、zoon(县区);userInfo中存储的是用户信息,一共4个字段,依次是mail(邮箱地址)、city(城市代码)、main(是否主城市,1是0不是)、note(备注信息,即城市名称)。大家可以在下图中看到本程序所用数据库的结构。
然后我们举个例子,比如从数据库中查找主城市代码和增加一个新用户:本文出自三思之旅博客http://think3t.iteye.com,转载请注明出处。
def getMainCityCode(self): self.conn = sqlite.connect('data.db') #连接数据库data.db,如果不存在将会创建 self.curs = self.conn.cursor() #建立游标 query = 'SELECT city FROM userInfo WHERE main = 1' #SQL语句 self.curs.execute(query) #执行SQL语句 rows = self.curs.fetchall() #获取查询结果,是一个二维列表 return rows[0][0] #返回主城市代码 def addItem(self, table, values): self.conn = sqlite.connect('data.db') #连接数据库data.db,如果不存在将会创建 self.curs = self.conn.cursor() #建立游标 query = 'INSERT INTO ' + table + ' VALUES (?,?,?,?)' #SQL语句 self.curs.execute(query, values) #执行SQL语句 self.conn.commit() #提交事务,保存数据库 return True
通常情况下,SQL操作需要传入一些值,就像上述代码中第二个方法一样。这种情况下,不要使用Python的字符串操作把值组合进SQL语句,因为这样不安全,会使程序易于受到SQL注入攻击。更安全的做法是,使用参数替换。就像上述代码一样,每个值用一个问号代替,然后把真正的值(元组形式)作为execute()方法的第二个参数传入。注意此处,第二个参数一定是元组形式,即使只有一个值,也要以无组形式传入,这种情况下应该用小括号括住并且在值后加一个逗号,即(value,)这种形式。举例如下:
# Never do this -- insecure! symbol = 'IBM' c.execute("select * from stocks where symbol = '%s'" % symbol) # Do this instead t = (symbol,) c.execute('select * from stocks where symbol=?', t) # Larger example for t in [('2006-03-28', 'BUY', 'IBM', 1000, 45.00), ('2006-04-05', 'BUY', 'MSFT', 1000, 72.00), ('2006-04-06', 'SELL', 'IBM', 500, 53.00), ]: c.execute('insert into stocks values (?,?,?,?,?)', t)
我为了使用方便,把这些对数据库的操作封装在MySearcher类中,代码很简单。本文出自三思之旅博客http://think3t.iteye.com,转载请注明出处。
#! /usr/bin/env python # coding=utf-8 import sqlite3 as sqlite class MySearcher(): def __init__(self, database='data.db'): self.database = database self.conn = sqlite.connect(self.database) self.curs = self.conn.cursor() def addItem(self, table, values): query = 'INSERT INTO ' + table + ' VALUES (?,?,?,?)' self.curs.execute(query, values) self.conn.commit() return True def delItem(self, mail, city): query = 'DELETE FROM userInfo WHERE mail=? AND city=?' self.curs.execute(query, (mail, city)) self.conn.commit() return True def searchItem(self, table, item, value): if item == '': query = 'SELECT * FROM ' + table self.curs.execute(query) else: query = 'SELECT * FROM ' + table + ' WHERE ' + item + ' =?' self.curs.execute(query, (value,)) rows = self.curs.fetchall() return rows def getRowCount(self, table): query = 'SELECT * FROM ' + table self.curs.execute(query) rowCount = len(self.curs.fetchall()) return rowCount def listProvs(self): query = 'SELECT DISTINCT prov FROM cityInfo ORDER BY id' self.curs.execute(query) rows = self.curs.fetchall() result = [] for row in rows: result.append(row[0]) return result def listCityOfProv(self, prov=u'北京'): query = 'SELECT DISTINCT city FROM cityInfo WHERE prov = ? ORDER BY id' self.curs.execute(query, (prov,)) rows = self.curs.fetchall() result = [] for row in rows: result.append(row[0]) return result def listZoonOfCity(self, prov=u'北京', city=u'北京'): query = 'SELECT zoon FROM cityInfo WHERE prov = ? AND city = ? ORDER BY id' self.curs.execute(query, (prov, city)) rows = self.curs.fetchall() result = [] for row in rows: result.append(row[0]) return result def getCityCode(self, prov=u'北京', city=u'北京', zoon=u'北京'): query = 'SELECT id FROM cityInfo WHERE prov=? AND city=? AND zoon = ?' self.curs.execute(query, (prov, city, zoon)) rows = self.curs.fetchall() return rows[0][0] def getMainCityCode(self): query = 'SELECT city FROM userInfo WHERE main = 1' self.curs.execute(query) rows = self.curs.fetchall() return rows[0][0] def setMainCity(self, mail, city): query = 'UPDATE userInfo set main=? WHERE mail=? AND city=?' self.curs.execute(query, (True, mail, city)) self.conn.commit() return True def isMainCity(self, mail, city): query = 'SELECT main FROM userInfo WHERE mail=? AND city=?' self.curs.execute(query, (mail, city)) rows = self.curs.fetchall() return rows[0][0] def getUserInfo(self): query = 'SELECT mail,city,note FROM userInfo' self.curs.execute(query) rows = self.curs.fetchall() return rows def clearMainCity(self): query = 'UPDATE userInfo SET main=0 WHERE main=1' self.curs.execute(query) self.conn.commit() return True def close(self): self.conn.close() if __name__ == '__main__': mysch = MySearcher() print mysch.listProvs() print mysch.listCityOfProv(u'北京')
另外,我也把我建的数据库放出来,里面包含了我从中国天气网上提取的全国几千个城市的城市代码,提取这些信息也费了我不少功夫,大家可以直接拿来用。OK,本篇文章到此为止,欢迎大家继续关注。本文出自三思之旅博客http://think3t.iteye.com,转载请注明出处。
相关推荐
天气查询功能可能包括了获取温度、湿度、风向、风速、空气质量等关键数据,并可能有未来几天的天气预报,让用户提前做好准备。同时,它还具备课程表管理功能,用户可以方便地添加、编辑和删除自己的课程安排,提醒...
通过设定定时任务,应用可以自动在后台定期获取最新的气象数据,为用户提供及时准确的天气预报。这种技术的运用,既提升了用户体验,也减轻了服务器压力。 在"KnowWeather-master"的源码中,我们还能学习到如何利用...
一起乐网址导航——最实用的上网导航,它提供多搜索引擎入口、便民查询工具、天气预报、邮箱登录、新闻阅读等上网常用服务,提供最快捷高效的导航帮助,并努力让更多优秀网站进入网友的生活,是网民上网的浏览器主页...
一起乐网址导航——最实用的上网导航,它提供多搜索引擎入口、便民查询工具、天气预报、邮箱登录、新闻阅读等上网常用服务,提供最快捷高效的导航帮助,并努力让更多优秀网站进入网友的生活,是网民上网的浏览器主页...
此外,系统设计还需要考虑与其他系统的集成,如PMS(Property Management System)与POS(Point of Sale)系统的联动,以及与外部服务如天气预报、交通信息的对接,以提供更全面的服务。 总结,宾馆管理系统详细...
支持网络校时,语音报时、闹钟、公历农历查询与转换,节日定制,个性签名,更换背景(透明或使用自己的照片、图片),定时关机、垃圾清理、邮箱一键登录、文件一键保存到邮箱、记事提醒、私人磁盘、天气预报、简易...
6. 生活助手:提供天气预报、快递查询、周边商家信息等,满足日常生活需求。 四、安全与隐私保护 平台对用户数据进行加密处理,保障信息安全;遵循微信小程序的隐私政策,合理获取并使用用户授权信息;设置举报机制...
同时,考虑到航空物流业务的复杂性,可能还需要集成第三方API,如天气预报、航班动态等,这需要熟练掌握网络编程和接口调用技术。 在测试阶段,会进行单元测试、集成测试和系统测试,确保所有功能正常运行,无明显...
4. **数据集成**:可以整合内部或外部的数据源,如天气预报、新闻API等,为用户提供全面的信息服务。 5. **搜索功能**:内置搜索引擎,方便用户快速查找所需信息。 6. **安全性**:通过身份验证和授权机制保护用户...
"酷爽天气"可能需要申请INTERNET权限以便进行网络通信,以及ACCESS_FINE_LOCATION权限来获取用户的位置信息,以便提供更精确的天气预报。 在项目组织结构上,遵循MVP(Model-View-Presenter)或MVVM(Model-View-...
开发者可能会使用RecyclerView来展示天气预报,实现滚动效果,同时结合Adapter进行数据绑定,提高界面的动态性。此外,Material Design的设计原则也被广泛应用,为用户提供一致且现代化的视觉体验。 在功能实现上,...
首页包含站点导航、搜索引擎、新闻、公告、会员俱乐部、天气预报和友情链接等基础功能。 - **网上学校**:涵盖教学与教务管理、远程网校、考研信息、答疑解惑、人才供求和科技成果等,提供学籍管理、课程设置、...
这个Web应用程序旨在通过其简洁的图形用户界面(GUI)为用户提供便利,帮助他们规划周末时光,同时获取实时的天气预报和电影资讯。 “HappyWeekend”项目的核心在于它的Java编程基础。Java是一种广泛应用于Web开发...
【阳光安卓应用——打造你的天气查询利器】 "Sunshine"是一款专为Android用户设计的简单天气应用程序,旨在提供直观、便捷的气象信息查询服务。这款应用以用户友好为设计核心,利用Java编程语言构建,实现了对天气...
同时,Service也可能被用来在后台持续执行任务,如定时更新天气预报,避免频繁唤醒用户界面。 在数据处理方面,"Stormy"可能使用了Android的AsyncTask或者IntentService来异步加载网络数据,避免阻塞主线程。同时,...
此外,应用可能还包含其他特性,如历史天气数据查看、未来预报、空气质量指数、穿衣建议、出行建议等,以提供全面的气象服务。 从提供的压缩包文件名称“Weather-App-Hava-durumu-Uygulamas--main”来看,这可能...
2. **活动(Activity)与片段(Fragment)**:应用主要包含两个关键组件——`ForecastActivity`(主活动)和`ForecastFragment`(天气预报片段)。`ForecastActivity`负责管理整体视图,而`ForecastFragment`展示...
4. **Web服务集成**:应用可能通过API接口与Google Maps、OpenWeatherMap等第三方服务进行集成,获取地图导航、天气预报等信息,为用户提供准确的旅行建议。 5. **用户界面**:JavaFX或Swing可能被用于构建用户友好...
2. **实时信息更新**:包括航班、火车、酒店等信息的实时查询和预订,以及天气预报、交通状况等动态信息。 3. **智能推荐**:利用大数据和算法,根据用户的搜索历史、评价等数据,推荐合适的旅行线路和活动。 4. **...