现在的位置: 首页 > 综合 > 正文

Python模拟Web Fetion给好友发送信息(数据库编程模块)

2013年10月08日 ⁄ 综合 ⁄ 共 4982字 ⁄ 字号 评论关闭

数据库就主要说下sqlalchemy和elixir吧,其实我也没怎么学,就是之前在研究一个工程型代码的时候学习了点,然后就拿来直接用了。

先介绍下elixir:

官方的文档:http://elixir.ematia.de/trac/wiki/TutorialDivingIn

elixir主要就是用来封装sqlalchemy的ORM模块的(个人的见解)

代码:

数据库中的表有:FetionUsers, ProvincesMap,CitiesMap,sendInfo四个表

FetionUsers就是用来存用户信息的

ProvincesMap存省份名对应的字典,同理CitiesMap也是

sendInfo存你发送的信息

日志文件没有弄

'''
Created on 2012-3-16

@author: xkey
'''

from elixir import *

class FetionUsers(Entity):
    using_options(tablename = 'FetionUsers',autoload = True)
    provinceUser = ManyToOne('ProvincesMap')
    cityUser = ManyToOne('CitiesMap')

class ProvincesMap(Entity):
    using_options(tablename = 'ProvincesMap',autoload = True)
    fetionUser = OneToMany('FetionUsers')
    
class CitiesMap(Entity):
    using_options(tablename = 'CitiesMap',autoload = True)
    fetionUser = OneToMany('FetionUsers')

class SendMsg(Entity):
    using_options(tablename = 'sendInfo',autoload = True)

setup_all()

def ExecuteQuery(table,**kwargs):#查询一个表(table),**kwargs就是限制语句
    try:
        result = table.query.filter_by(kwargs).all()
        session.commit()
        return result
    except Exception,e:
        print e

def InsertRecords(table,**kwargs):#插入一条记录
    
    t = table(**kwargs)
    session.commit()
    session.close()
    return 1

def RemoveRecords(table,**kwargs):#删除一条记录
    try:
        t = table.query.filter_by(**kwargs).all()
        for item in t:
            session.delete(item)
    except Exception, e:
        print "No relation records"
        return 0
    session.commit()
    session.close()
    return 1

下面介绍sqlalchemy

它起到一个承上启下的作用,承上当然就是连接数据库,启下就是调用elixir去实现对数据库的各种操作

sqlalchemy学习网址有很多

推荐两个学习网址:

http://www.rmunn.com/sqlalchemy-tutorial/tutorial.html

http://mapfish.org/doc/tutorials/sqlalchemy.html

下面给出代码:代码简单易懂

#-*-coding:utf-8-*-

from elixir import *
import os,datetime,sys
from sqlalchemy.orm import sessionmaker


default_encoding = 'utf-8'
if sys.getdefaultencoding() != default_encoding:
    reload(sys)
    sys.setdefaultencoding(default_encoding)

class DbOper:
    def __init__(self,dbConString):
        self.__dbConString = dbConString
        if(self._setupDatabase() < 1):#连接数据库
            print "DataBase Initialize error"
    def insertPrivinceMap(self):
        provinceMap =\
        {
            "安徽":'AAH',"北京":'ABJ',"福建":'AFJ',"甘肃":'AGS',"广东":'AGD',\
            "广西":'AGX',"贵州":'AGZ',"海南":'AHI',"河北":'AHE',"河南":'AHA',\
            "黑龙江":'AHL',"湖南":'AHN',"湖北":'AHB',"吉林":'AJL','江苏':'AJS',\
            "江西":'AJX','辽宁':'ALN','内蒙':'AMN','宁夏':'ANX','青海':'AQH',\
            '山东':'ASD','山西':'ASX','陕西':'ASN','上海':'ASH','四川':'ASC',\
            '台湾':'ATW','天津':'ATJ','西藏':'AXZ','新疆':'AXJ','云南':'AYN',\
            '浙江':'AZJ','重庆':'ACQ','香港':'AXG','澳门':'AAM'
        }
        for key in provinceMap.keys():
            value = provinceMap[key]
            self.__db.InsertRecords(self.__db.ProvincesMap,realname = unicode(key),imagename = value)
        self.__db.session.commit()
        self.__db.session.close()
    
    def insertCityMap(self):
        cityMap = {'杭州':'hangzhou','滁州':'chuzhou','北京':'beijing'}
        for key in cityMap.keys():
            value = cityMap[key]
            self.__db.InsertRecords(self.__db.CitiesMap,realname = unicode(key),imagename = value)
        self.__db.session.commit()
        self.__db.session.close()
        
    def insertFetionUsers(self,user,province,city,id):
        self.__db.InsertRecords(self.__db.FetionUsers,username = unicode(user),province = unicode(province),\
                                    city = unicode(city),phoneid = id)
        self.__db.session.commit()
        self.__db.session.close()
        
    def insertSendMsgInfo(self,username,message,now = datetime.datetime.now()):
        self.__db.InsertRecords(self.__db.SendMsg,username = unicode(username),message = unicode(message),sendtime = now)
        self.__db.session.commit()
        self.__db.session.close()
    
    def querySendMsgInfo(self):
        res = self.__db.session.query(self.__db.SendMsg.id,self.__db.SendMsg.username,self.__db.SendMsg.message,\
                                      self.__db.SendMsg.sendtime).all()
        self.__db.session.commit()
        return res
    
    def queryFetionUsers(self):
        res = self.__db.session.query(self.__db.FetionUsers.username,self.__db.FetionUsers.province,\
                                      self.__db.FetionUsers.city,self.__db.FetionUsers.phoneid).all()
        self.__db.session.commit()
        return res
    def queryProvinceMap(self):
        res = self.__db.session.query(self.__db.ProvincesMap.realname,self.__db.ProvincesMap.imagename).all()
        self.__db.session.commit()
        return res
#        print len(res[0])
#        print res[0][0]
    
    def queryCityMap(self):
        res = self.__db.session.query(self.__db.CitiesMap.realname,self.__db.CitiesMap.imagename).all()
        self.__db.session.commit()
        return res
#        print res[0][0].encode('gbk')
    
    def deleteRecord(self,tableNum,name):
        if tableNum == 1:
            self.__db.RemoveRecords(self.__db.CitiesMap,realname = unicode(name))
        else :
            self.__db.RemoveRecords(self.__db.FetionUsers,username = unicode(name))
        self.__db.session.commit()
        self.__db.session.close()
    
    def deleteTable(self,tableNum):
        if tableNum == 1:
            self.__db.RemoveRecords(self.__db.CitiesMap)
        elif tableNum == 2:
            self.__db.RemoveRecords(self.__db.FetionUsers)
        self.__db.session.commit()
        self.__db.session.close()
    
    def _setupDatabase(self):
        try:
            from sqlalchemy.engine import create_engine
            
            engine = create_engine(self.__dbConString,echo = False)
            engine.text_factory = str
            metadata.bind = engine
            Session = sessionmaker(bind = engine,autocommit = True)
            import dborm
            self.__db = locals()['dborm'] #得到dborm.py中的方法,就是上面elixir的代码
        except Exception,e:
            print "Set up database error %s" % e
            return -1
        return 1
    def closeSession(self):
        self.__db.session.close()
        
    def insertCity(self,real,image):
        self.__db.InsertRecords(self.__db.CitiesMap,realname = unicode(real),imagename = image)
        self.__db.session.commit()
        self.__db.session.close()

一句SQL语句不用写就搞定了对数据库的各种操作,而且还屏蔽了各种数据库之间SQL语句语法的差异,这就是sqlchemy+elixir的强大之处

抱歉!评论已关闭.