#!/usr/bin/env python2.7 # -*- coding: utf-8 -*- from sqlalchemy import Column, String, Integer, ForeignKey, Text from sqlalchemy.orm import relationship, backref from db.model import BaseModel from db.model.video import Video __author__ = "*****@*****.**" __BASE_MODEL = BaseModel.get_base_model() # 定义Barrage对象,存储弹幕的全部相关信息 class Barrage(__BASE_MODEL): __tablename__ = "barrage" row_id = Column(String(30), primary_key=True) # 弹幕在弹幕数据库中rowID 用于“历史弹幕”功能。 play_timestamp = Column(String(50), nullable=False) # 弹幕出现的时间 以秒数为单位。 type = Column(Integer, nullable=False) # 弹幕的模式1..3 滚动弹幕 4底端弹幕 5顶端弹幕 6.逆向弹幕 7精准定位 8高级弹幕 font_size = Column(Integer, nullable=False) # 字号, 12非常小,16特小,18小,25中,36大,45很大,64特别大 font_color = Column(String(50), nullable=False) # 字体的颜色 以HTML颜色的十位数为准 unix_timestamp = Column(String(50), nullable=False) # Unix格式的时间戳。基准时间为 1970-1-1 08:00:00 pool = Column(Integer, nullable=False) # 弹幕池 0普通池 1字幕池 2特殊池 【目前特殊池为高级弹幕专用】 sender_id = Column(String(20), nullable=False) # 发送者的ID,用于“屏蔽此弹幕的发送者”功能 content = Column(Text, nullable=False) # 弹幕内容 # 外键信息 video_cid = Column(String(30), ForeignKey("video.cid")) # 这样就可以使用video.barrages获得该视频的所有弹幕信息。
#!/usr/bin/env python2.7 # -*- coding: utf-8 -*- from sqlalchemy import Column, String, Text, ForeignKey, Integer from sqlalchemy.orm import relationship, backref from db.model import BaseModel from db.model.xinfan import XinFan __author__ = "*****@*****.**" __BASE_MODEL = BaseModel.get_base_model() # 定义movie对象,保存movie的id,标题,以及链接等信息 class Video(__BASE_MODEL): __tablename__ = "video" cid = Column(String(30), nullable=False) # 视频对应的弹幕cid title = Column(Text, nullable=True) # 视频的标题信息。 tags = Column(Text, nullable=False) # 视频的分类标签信息,格式为:一级标签\t二级标签... metakeywords = Column(Text, nullable=False) # 视频的标签信息,格式为:标签1\t标签2\t标签3... aid = Column(String(30), primary_key=True) # 视频的aid url = Column(Text, nullable=False) # 视频的网址链接 season_index = Column(Integer, nullable=True) xinfan_season_id = Column(String(30), ForeignKey('xinfan.season_id'), nullable=True) xinfan = relationship("XinFan", backref=backref("videos", uselist=True,
class DBUtil(object): # 数据库连接字符串,由于弹幕中常常含有特殊的字符串,因此可能需要 ?charset=utf8mb4 来解决。 # 参考链接:http://docs.sqlalchemy.org/en/latest/dialects/mysql.html#dialect-mysql __CONN_STRING = "mysql+mysqlconnector://root:18817870106@localhost:3306/barragedb?charset=utf8mb4&use_unicode=1" # create a configured "Session" class __SESSION = None __ENGINE = None __BASE_MODEL = BaseModel.get_base_model() # 构建数据库链接 @staticmethod def construct_conn_str(db_type, db_driver, db_user_name, db_pass, hostname, port, db_name): # '数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名' __CONN_STRING = db_type + "+" + db_driver + "://" + db_user_name + ":" \ + db_pass + "@" + hostname + ":" + str(port) + "/" + db_name DBUtil.__SESSION = None DBUtil.__ENGINE = None @staticmethod def create_engine(conn_str=None): if conn_str is None: conn_str = DBUtil.__CONN_STRING if DBUtil.__ENGINE is None: # engine 作为编程语言与数据库的接口,conn_str 中需要一致 数据库与 编程语言的字符编码,这样才不会出现乱码。这里双方都是 # utf8mb4 DBUtil.__ENGINE = create_engine(conn_str) return DBUtil.__ENGINE # engine对象和session对象都可作用于数据库的增删改查操作。 # 创建一个配置好的Session类,产生session对象,用于数据库的增删改查。 @staticmethod def create_configured_session(): if DBUtil.__SESSION is None: engine = DBUtil.create_engine() return sessionmaker(bind=engine) return DBUtil.__SESSION # 打开一个新的session,数据库的表创建,增删改查操作都要在session中进行。 @staticmethod def open_session(): configured_session = DBUtil.create_configured_session() session = configured_session() return session # 关闭之前新建立的session。 @staticmethod def close_session(session): if session is not None: session.close() @staticmethod @contextmanager def my_scoped_session(): """Provide a transactional scope around a series of operations.""" session = DBUtil.create_configured_session() try: yield session session.commit() except Exception as e: print e session.rollback() finally: session.close() # 初始化数据库,创建数据库表等。 @staticmethod def init_db(): # 数据库包装这一层,存在大量的encode操作,使用的是database的charset,在数据库端指定了使用utf8mb4编码,那么外部模块与 # 数据库连接时,要使用相同的编码,修改数据库数据时也应该使用相同的编码。 # 而Python的codec模块不知道utf8mb4这种表述,所以需要使用别名。make python understand 'utf8mb4' as an alias for 'utf8'。 codecs.register(lambda name: codecs.lookup('utf8') if name == 'utf8mb4' else None) # 创建对应的数据库表。 engine = DBUtil.create_engine() DBUtil.__BASE_MODEL.metadata.create_all(engine)