123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- #coding:utf-8
- import datetime
- from sqlalchemy import Column, Integer, String, DateTime, Numeric, create_engine, VARCHAR
- from sqlalchemy.ext.declarative import declarative_base
- from sqlalchemy.orm import sessionmaker
- from config import DB_CONFIG
- from db.ISqlHelper import ISqlHelper
- '''
- sql操作的基类
- 包括ip,端口,types类型(0高匿名,1透明),protocol(0 http,1 https http),country(国家),area(省市),updatetime(更新时间)
- speed(连接速度)
- '''
- BaseModel = declarative_base()
- class Proxy(BaseModel):
- __tablename__='proxys'
- id = Column(Integer, primary_key=True,autoincrement=True)
- ip = Column(VARCHAR(16), nullable=False)
- port = Column(Integer, nullable=False)
- types = Column(Integer, nullable=False)
- protocol = Column(Integer, nullable=False,default=0)
- country = Column(VARCHAR(100), nullable=False)
- area = Column(VARCHAR(100), nullable=False)
- updatetime = Column(DateTime(),default=datetime.datetime.utcnow)
- speed = Column(Numeric(5,2),nullable=False)
- score = Column(Integer, nullable=False,default=0)
- class SqlHelper(ISqlHelper):
- params = {'ip':Proxy.ip,'port':Proxy.port,'types':Proxy.types,'protocol':Proxy.protocol,'country':Proxy.country,'area':Proxy.area,'score':Proxy.score}
- def __init__(self):
- if 'sqlite' in DB_CONFIG['DB_CONNECT_STRING']:
- connect_args={'check_same_thread':False}
- self.engine = create_engine(DB_CONFIG['DB_CONNECT_STRING'],echo=False,connect_args=connect_args)
- else:
- self.engine = create_engine(DB_CONFIG['DB_CONNECT_STRING'],echo=False)
- DB_Session = sessionmaker(bind=self.engine)
- self.session = DB_Session()
- def init_db(self):
- BaseModel.metadata.create_all(self.engine)
- def drop_db(self):
- BaseModel.metadata.drop_all(self.engine)
- def insert(self,value):
- proxy = Proxy(ip=value['ip'],port=value['port'],types=value['types'],protocol=value['protocol'],country = value['country'],
- area=value['area'],speed=value['speed'])
- self.session.add(proxy)
- self.session.commit()
- def delete(self, conditions=None):
- if conditions:
- conditon_list = []
- for key in conditions.keys():
- if self.params.get(key,None):
- conditon_list.append(self.params.get(key)==conditions.get(key))
- conditions = conditon_list
- query = self.session.query(Proxy)
- for condition in conditions:
- query = query.filter(condition)
- deleteNum = query.delete()
- self.session.commit()
- else:
- deleteNum = 0
- return ('deleteNum',deleteNum)
- def update(self, conditions=None,value=None):
- '''
- conditions的格式是个字典。类似self.params
- :param conditions:
- :param value:也是个字典:{'ip':192.168.0.1}
- :return:
- '''
- if conditions and value:
- conditon_list = []
- for key in conditions.keys():
- if self.params.get(key,None):
- conditon_list.append(self.params.get(key)==conditions.get(key))
- conditions = conditon_list
- query = self.session.query(Proxy)
- for condition in conditions:
- query = query.filter(condition)
- updatevalue = {}
- for key in value.keys():
- if self.params.get(key,None):
- updatevalue[self.params.get(key,None)]=value.get(key)
- updateNum = query.update(updatevalue)
- self.session.commit()
- else:
- updateNum=0
- return {'updateNum':updateNum}
- def select(self, count=None,conditions=None):
- '''
- conditions的格式是个字典。类似self.params
- :param count:
- :param conditions:
- :return:
- '''
- if conditions:
- conditon_list = []
- for key in conditions.keys():
- if self.params.get(key,None):
- conditon_list.append(self.params.get(key)==conditions.get(key))
- conditions = conditon_list
- else:
- conditions=[]
- query = self.session.query(Proxy.ip,Proxy.port,Proxy.score)
- if len(conditions)>0 and count:
- for condition in conditions:
- query = query.filter(condition)
- return query.order_by(Proxy.score.desc(),Proxy.speed).limit(count).all()
- elif count:
- return query.order_by(Proxy.score.desc(),Proxy.speed).limit(count).all()
- elif len(conditions)>0:
- for condition in conditions:
- query = query.filter(condition)
- return query.order_by(Proxy.score.desc(),Proxy.speed).all()
- else:
- return query.order_by(Proxy.score.desc(),Proxy.speed).all()
- def close(self):
- pass
- if __name__=='__main__':
- sqlhelper = SqlHelper()
- sqlhelper.init_db()
- proxy = {'ip':'192.168.1.1','port':80,'type':0,'protocol':0,'country':u'中国','area':u'广州','speed':11.123}
- sqlhelper.insert(proxy)
|