`

打造自己的天气预报之(六)——对数据库的操作

阅读更多

在上一篇

打造自己的天气预报之(五)——实现按钮功能之设置窗口

中,我实现了设置按钮的功能,其中涉及到了从数据库中读写数据。我使用的是SQLite数据库,这是一种轻量级的基于单一磁盘文件的关系数据库,不需要单独的服务器即可使用。从2.5版本开始,Python已经集成了SQLite模块(模块名:sqlite3),所以对于天气预报这种小型程序来说,用SQLite那可是相当方便。本文出自三思之旅博客http://think3t.iteye.com,转载请注明出处。

本篇简单介绍一下Python如何操纵SQLite数据库。注意,我讲的重点是Python操纵SQLite,而不是讲数据库的。因为SQLite也是一种关系型数据,常用的SQL语句都支持,所以本文不再赘述。

Python操纵SQLite数据库,可以分为如下几步:

 

  1. 连接数据库
  2. 建立游标
  3. 执行SQL命令
  4. 获取查询结果(仅查询需要)
  5. 提交当前事务(查询不需要)
  6. 关闭数据库连接

先说一下本程序用到的数据库。本人对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,转载请注明出处。

  • 大小: 77.6 KB
  • 大小: 77.2 KB
2
1
分享到:
评论

相关推荐

    天气课程表demo样例

    天气查询功能可能包括了获取温度、湿度、风向、风速、空气质量等关键数据,并可能有未来几天的天气预报,让用户提前做好准备。同时,它还具备课程表管理功能,用户可以方便地添加、编辑和删除自己的课程安排,提醒...

    一款美观、实用的天气app。实践了模块化架构 和 Android Architecture Components

    通过设定定时任务,应用可以自动在后台定期获取最新的气象数据,为用户提供及时准确的天气预报。这种技术的运用,既提升了用户体验,也减轻了服务器压力。 在"KnowWeather-master"的源码中,我们还能学习到如何利用...

    一起乐网址导航 v2.001_SQL2000_2011818

    一起乐网址导航——最实用的上网导航,它提供多搜索引擎入口、便民查询工具、天气预报、邮箱登录、新闻阅读等上网常用服务,提供最快捷高效的导航帮助,并努力让更多优秀网站进入网友的生活,是网民上网的浏览器主页...

    一起乐网址导航 v2.001_SQL2000_2011818.rar

    一起乐网址导航——最实用的上网导航,它提供多搜索引擎入口、便民查询工具、天气预报、邮箱登录、新闻阅读等上网常用服务,提供最快捷高效的导航帮助,并努力让更多优秀网站进入网友的生活,是网民上网的浏览器主页...

    宾馆管理系统详细设计.doc

    此外,系统设计还需要考虑与其他系统的集成,如PMS(Property Management System)与POS(Point of Sale)系统的联动,以及与外部服务如天气预报、交通信息的对接,以提供更全面的服务。 总结,宾馆管理系统详细...

    德平桌面日历(calendar)7.0版

    支持网络校时,语音报时、闹钟、公历农历查询与转换,节日定制,个性签名,更换背景(透明或使用自己的照片、图片),定时关机、垃圾清理、邮箱一键登录、文件一键保存到邮箱、记事提醒、私人磁盘、天气预报、简易...

    2021031806_基于微信小程序的校园易平台的设计与实现.rar

    6. 生活助手:提供天气预报、快递查询、周边商家信息等,满足日常生活需求。 四、安全与隐私保护 平台对用户数据进行加密处理,保障信息安全;遵循微信小程序的隐私政策,合理获取并使用用户授权信息;设置举报机制...

    航空物流管理系统,delphi

    同时,考虑到航空物流业务的复杂性,可能还需要集成第三方API,如天气预报、航班动态等,这需要熟练掌握网络编程和接口调用技术。 在测试阶段,会进行单元测试、集成测试和系统测试,确保所有功能正常运行,无明显...

    门户网站管理系统,前后端分离的,可运行,无bug

    4. **数据集成**:可以整合内部或外部的数据源,如天气预报、新闻API等,为用户提供全面的信息服务。 5. **搜索功能**:内置搜索引擎,方便用户快速查找所需信息。 6. **安全性**:通过身份验证和授权机制保护用户...

    coolweather:CoolWeather Android应用程序

    "酷爽天气"可能需要申请INTERNET权限以便进行网络通信,以及ACCESS_FINE_LOCATION权限来获取用户的位置信息,以便提供更精确的天气预报。 在项目组织结构上,遵循MVP(Model-View-Presenter)或MVVM(Model-View-...

    coolweather:一个关于天气信息的简单应用

    开发者可能会使用RecyclerView来展示天气预报,实现滚动效果,同时结合Adapter进行数据绑定,提高界面的动态性。此外,Material Design的设计原则也被广泛应用,为用户提供一致且现代化的视觉体验。 在功能实现上,...

    大学生IT创业计划书.docx

    首页包含站点导航、搜索引擎、新闻、公告、会员俱乐部、天气预报和友情链接等基础功能。 - **网上学校**:涵盖教学与教务管理、远程网校、考研信息、答疑解惑、人才供求和科技成果等,提供学籍管理、课程设置、...

    HappyWeekend:这是一个有趣的基于Java的个性化个人周末活动助手的Web应用程序,具有一个简单的GUI,可通过调用相应的外部Web服务来显示天气信息和电影信息

    这个Web应用程序旨在通过其简洁的图形用户界面(GUI)为用户提供便利,帮助他们规划周末时光,同时获取实时的天气预报和电影资讯。 “HappyWeekend”项目的核心在于它的Java编程基础。Java是一种广泛应用于Web开发...

    Sunshine:阳光安卓应用

    【阳光安卓应用——打造你的天气查询利器】 "Sunshine"是一款专为Android用户设计的简单天气应用程序,旨在提供直观、便捷的气象信息查询服务。这款应用以用户友好为设计核心,利用Java编程语言构建,实现了对天气...

    Stormy-Android-App-:天气应用。 感谢我的老师 Ben

    同时,Service也可能被用来在后台持续执行任务,如定时更新天气预报,避免频繁唤醒用户界面。 在数据处理方面,"Stormy"可能使用了Android的AsyncTask或者IntentService来异步加载网络数据,避免阻塞主线程。同时,...

    Weather-App-Hava-durumu-Uygulamas-:该应用程序显示了我们所在地的天气

    此外,应用可能还包含其他特性,如历史天气数据查看、未来预报、空气质量指数、穿衣建议、出行建议等,以提供全面的气象服务。 从提供的压缩包文件名称“Weather-App-Hava-durumu-Uygulamas--main”来看,这可能...

    nanodegree-sunshine:Android Nanodegree Weather应用程式

    2. **活动(Activity)与片段(Fragment)**:应用主要包含两个关键组件——`ForecastActivity`(主活动)和`ForecastFragment`(天气预报片段)。`ForecastActivity`负责管理整体视图,而`ForecastFragment`展示...

    travelPlanner

    4. **Web服务集成**:应用可能通过API接口与Google Maps、OpenWeatherMap等第三方服务进行集成,获取地图导航、天气预报等信息,为用户提供准确的旅行建议。 5. **用户界面**:JavaFX或Swing可能被用于构建用户友好...

    Travel-Planner-Design

    2. **实时信息更新**:包括航班、火车、酒店等信息的实时查询和预订,以及天气预报、交通状况等动态信息。 3. **智能推荐**:利用大数据和算法,根据用户的搜索历史、评价等数据,推荐合适的旅行线路和活动。 4. **...

Global site tag (gtag.js) - Google Analytics