Example #1
0
#!/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获得该视频的所有弹幕信息。
Example #2
0
#!/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,
Example #3
0
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)