ayaka.depend.db

  1import json
  2from pydantic import Field
  3from typing import List, TYPE_CHECKING
  4from typing_extensions import Self
  5from .depend import AyakaDepend
  6from .sql import PrimaryKey, JsonKey, insert_or_replace, create_table, drop_table, insert_or_replace_many, select_many, wrap, db
  7
  8if TYPE_CHECKING:
  9    from .. import AyakaApp
 10
 11
 12class AyakaDB(AyakaDepend):
 13    '''
 14```
 151. 继承时要书写 __table_name__
 162. 如果要把该类放入回调函数的参数表中,则还要编写classmethod async def create方法
 173. 设置主键需要使用
 18    <name>:<type> = Field(extra=AyakaDB.__primary_key__)
 194. 一些特殊类型的数据请设置其为json形式存取 
 20    <name>:<type> = Field(extra=AyakaDB.__json_key__)
 21    AyakaDB在写入时会自动序列化该数据为字符串,写入数据库,读取时则相反
 225. 若需要编写自定义读写数据方法,可以使用AyakaDB.get_db()方法获取sqlite3.Connection对象
 236. 使用前先调用classmethod def create_table
 24```
 25'''
 26    __table_name__ = ""
 27    __primary_key__ = PrimaryKey
 28    __json_key__ = JsonKey
 29
 30    def __init__(self, **data) -> None:
 31        if not self.__table_name__:
 32            raise Exception("__table_name__不可为空")
 33        super().__init__(**data)
 34
 35    @classmethod
 36    def _create_by_db_data(cls, data: dict):
 37        props = cls.props()
 38
 39        # 特殊处理json
 40        for k, v in props.items():
 41            extra: dict = v.get("extra", {})
 42            if extra.get("json"):
 43                if k in data:
 44                    data[k] = json.loads(data[k])
 45
 46        return cls(**data)
 47
 48    def dict(self, **params):
 49        data = super().dict(**params)
 50        props = self.props()
 51
 52        # 特殊处理json
 53        for k, v in props.items():
 54            extra: dict = v.get("extra", {})
 55            if extra.get("json"):
 56                if k in data:
 57                    data[k] = json.dumps(data[k], ensure_ascii=0)
 58        return data
 59
 60    @classmethod
 61    def drop_table(cls):
 62        drop_table(cls.__table_name__)
 63
 64    @classmethod
 65    def create_table(cls):
 66        '''根据数据类型自动创建表'''
 67        create_table(cls.__table_name__, cls)
 68
 69    @classmethod
 70    def replace(cls, data: Self):
 71        insert_or_replace(cls.__table_name__, data, "replace")
 72
 73    def save(self):
 74        '''写入数据库'''
 75        self.replace(self)
 76
 77    @classmethod
 78    def replace_many(cls, datas: List[Self]):
 79        insert_or_replace_many(cls.__table_name__, datas, "replace")
 80
 81    @classmethod
 82    def insert(cls, data: Self):
 83        insert_or_replace(cls.__table_name__, data, "insert")
 84
 85    @classmethod
 86    def insert_many(cls, datas: List[Self]):
 87        insert_or_replace_many(cls.__table_name__, datas, "insert")
 88
 89    @classmethod
 90    def select_many(cls, **params) -> List[Self]:
 91        '''按照params的值搜索数据,返回数据列表'''
 92        where = "1"
 93        if params:
 94            where = " and ".join(f"{k}={wrap(v)}" for k, v in params.items())
 95        return select_many(cls.__table_name__, cls, where)
 96
 97    @classmethod
 98    def select_one(cls, **params):
 99        '''按照params的值搜索数据,返回一项数据,若不存在,则自动根据params创建'''
100        datas = cls.select_many(**params)
101        if datas:
102            return datas[0]
103        return cls(**params)
104
105    @classmethod
106    def get_db(cls):
107        return db
108
109
110class AyakaGroupDB(AyakaDB):
111    '''继承时要书写`__table_name__`
112
113    主键有且仅有 group_id
114
115    使用前先调用classmethod def create_table'''
116    group_id: int = Field(extra=AyakaDB.__primary_key__)
117
118    @classmethod
119    async def _create_by_app(cls, app: "AyakaApp"):
120        return cls.select_one(group_id=app.group_id)
121
122
123class AyakaUserDB(AyakaDB):
124    '''继承时要书写`__table_name__`
125
126    主键有且仅有 group_id, user_id
127
128    使用前先调用classmethod def create_table'''
129    group_id: int = Field(extra=AyakaDB.__primary_key__)
130    user_id: int = Field(extra=AyakaDB.__primary_key__)
131
132    @classmethod
133    async def _create_by_app(cls, app: "AyakaApp"):
134        return cls.select_one(
135            group_id=app.group_id,
136            user_id=app.user_id
137        )
class AyakaDB(ayaka.depend.depend.AyakaDepend):
 13class AyakaDB(AyakaDepend):
 14    '''
 15```
 161. 继承时要书写 __table_name__
 172. 如果要把该类放入回调函数的参数表中,则还要编写classmethod async def create方法
 183. 设置主键需要使用
 19    <name>:<type> = Field(extra=AyakaDB.__primary_key__)
 204. 一些特殊类型的数据请设置其为json形式存取 
 21    <name>:<type> = Field(extra=AyakaDB.__json_key__)
 22    AyakaDB在写入时会自动序列化该数据为字符串,写入数据库,读取时则相反
 235. 若需要编写自定义读写数据方法,可以使用AyakaDB.get_db()方法获取sqlite3.Connection对象
 246. 使用前先调用classmethod def create_table
 25```
 26'''
 27    __table_name__ = ""
 28    __primary_key__ = PrimaryKey
 29    __json_key__ = JsonKey
 30
 31    def __init__(self, **data) -> None:
 32        if not self.__table_name__:
 33            raise Exception("__table_name__不可为空")
 34        super().__init__(**data)
 35
 36    @classmethod
 37    def _create_by_db_data(cls, data: dict):
 38        props = cls.props()
 39
 40        # 特殊处理json
 41        for k, v in props.items():
 42            extra: dict = v.get("extra", {})
 43            if extra.get("json"):
 44                if k in data:
 45                    data[k] = json.loads(data[k])
 46
 47        return cls(**data)
 48
 49    def dict(self, **params):
 50        data = super().dict(**params)
 51        props = self.props()
 52
 53        # 特殊处理json
 54        for k, v in props.items():
 55            extra: dict = v.get("extra", {})
 56            if extra.get("json"):
 57                if k in data:
 58                    data[k] = json.dumps(data[k], ensure_ascii=0)
 59        return data
 60
 61    @classmethod
 62    def drop_table(cls):
 63        drop_table(cls.__table_name__)
 64
 65    @classmethod
 66    def create_table(cls):
 67        '''根据数据类型自动创建表'''
 68        create_table(cls.__table_name__, cls)
 69
 70    @classmethod
 71    def replace(cls, data: Self):
 72        insert_or_replace(cls.__table_name__, data, "replace")
 73
 74    def save(self):
 75        '''写入数据库'''
 76        self.replace(self)
 77
 78    @classmethod
 79    def replace_many(cls, datas: List[Self]):
 80        insert_or_replace_many(cls.__table_name__, datas, "replace")
 81
 82    @classmethod
 83    def insert(cls, data: Self):
 84        insert_or_replace(cls.__table_name__, data, "insert")
 85
 86    @classmethod
 87    def insert_many(cls, datas: List[Self]):
 88        insert_or_replace_many(cls.__table_name__, datas, "insert")
 89
 90    @classmethod
 91    def select_many(cls, **params) -> List[Self]:
 92        '''按照params的值搜索数据,返回数据列表'''
 93        where = "1"
 94        if params:
 95            where = " and ".join(f"{k}={wrap(v)}" for k, v in params.items())
 96        return select_many(cls.__table_name__, cls, where)
 97
 98    @classmethod
 99    def select_one(cls, **params):
100        '''按照params的值搜索数据,返回一项数据,若不存在,则自动根据params创建'''
101        datas = cls.select_many(**params)
102        if datas:
103            return datas[0]
104        return cls(**params)
105
106    @classmethod
107    def get_db(cls):
108        return db
1. 继承时要书写 __table_name__
2. 如果要把该类放入回调函数的参数表中,则还要编写classmethod async def create方法
3. 设置主键需要使用
    <name>:<type> = Field(extra=AyakaDB.__primary_key__)
4. 一些特殊类型的数据请设置其为json形式存取 
    <name>:<type> = Field(extra=AyakaDB.__json_key__)
    AyakaDB在写入时会自动序列化该数据为字符串,写入数据库,读取时则相反
5. 若需要编写自定义读写数据方法,可以使用AyakaDB.get_db()方法获取sqlite3.Connection对象
6. 使用前先调用classmethod def create_table
AyakaDB(**data)
31    def __init__(self, **data) -> None:
32        if not self.__table_name__:
33            raise Exception("__table_name__不可为空")
34        super().__init__(**data)

Create a new model by parsing and validating input data from keyword arguments.

Raises ValidationError if the input data cannot be parsed to form a valid model.

def dict(self, **params):
49    def dict(self, **params):
50        data = super().dict(**params)
51        props = self.props()
52
53        # 特殊处理json
54        for k, v in props.items():
55            extra: dict = v.get("extra", {})
56            if extra.get("json"):
57                if k in data:
58                    data[k] = json.dumps(data[k], ensure_ascii=0)
59        return data

Generate a dictionary representation of the model, optionally specifying which fields to include or exclude.

@classmethod
def drop_table(cls):
61    @classmethod
62    def drop_table(cls):
63        drop_table(cls.__table_name__)
@classmethod
def create_table(cls):
65    @classmethod
66    def create_table(cls):
67        '''根据数据类型自动创建表'''
68        create_table(cls.__table_name__, cls)

根据数据类型自动创建表

@classmethod
def replace(cls, data: typing_extensions.Self):
70    @classmethod
71    def replace(cls, data: Self):
72        insert_or_replace(cls.__table_name__, data, "replace")
def save(self):
74    def save(self):
75        '''写入数据库'''
76        self.replace(self)

写入数据库

@classmethod
def replace_many(cls, datas: List[typing_extensions.Self]):
78    @classmethod
79    def replace_many(cls, datas: List[Self]):
80        insert_or_replace_many(cls.__table_name__, datas, "replace")
@classmethod
def insert(cls, data: typing_extensions.Self):
82    @classmethod
83    def insert(cls, data: Self):
84        insert_or_replace(cls.__table_name__, data, "insert")
@classmethod
def insert_many(cls, datas: List[typing_extensions.Self]):
86    @classmethod
87    def insert_many(cls, datas: List[Self]):
88        insert_or_replace_many(cls.__table_name__, datas, "insert")
@classmethod
def select_many(cls, **params) -> List[typing_extensions.Self]:
90    @classmethod
91    def select_many(cls, **params) -> List[Self]:
92        '''按照params的值搜索数据,返回数据列表'''
93        where = "1"
94        if params:
95            where = " and ".join(f"{k}={wrap(v)}" for k, v in params.items())
96        return select_many(cls.__table_name__, cls, where)

按照params的值搜索数据,返回数据列表

@classmethod
def select_one(cls, **params):
 98    @classmethod
 99    def select_one(cls, **params):
100        '''按照params的值搜索数据,返回一项数据,若不存在,则自动根据params创建'''
101        datas = cls.select_many(**params)
102        if datas:
103            return datas[0]
104        return cls(**params)

按照params的值搜索数据,返回一项数据,若不存在,则自动根据params创建

@classmethod
def get_db(cls):
106    @classmethod
107    def get_db(cls):
108        return db
Inherited Members
ayaka.depend.depend.AyakaDepend
props
pydantic.main.BaseModel
json
parse_obj
parse_raw
parse_file
from_orm
construct
copy
schema
schema_json
validate
update_forward_refs
class AyakaGroupDB(AyakaDB):
111class AyakaGroupDB(AyakaDB):
112    '''继承时要书写`__table_name__`
113
114    主键有且仅有 group_id
115
116    使用前先调用classmethod def create_table'''
117    group_id: int = Field(extra=AyakaDB.__primary_key__)
118
119    @classmethod
120    async def _create_by_app(cls, app: "AyakaApp"):
121        return cls.select_one(group_id=app.group_id)

继承时要书写__table_name__

主键有且仅有 group_id

使用前先调用classmethod def create_table

Inherited Members
AyakaDB
AyakaDB
dict
drop_table
create_table
replace
save
replace_many
insert
insert_many
select_many
select_one
get_db
ayaka.depend.depend.AyakaDepend
props
pydantic.main.BaseModel
json
parse_obj
parse_raw
parse_file
from_orm
construct
copy
schema
schema_json
validate
update_forward_refs
class AyakaUserDB(AyakaDB):
124class AyakaUserDB(AyakaDB):
125    '''继承时要书写`__table_name__`
126
127    主键有且仅有 group_id, user_id
128
129    使用前先调用classmethod def create_table'''
130    group_id: int = Field(extra=AyakaDB.__primary_key__)
131    user_id: int = Field(extra=AyakaDB.__primary_key__)
132
133    @classmethod
134    async def _create_by_app(cls, app: "AyakaApp"):
135        return cls.select_one(
136            group_id=app.group_id,
137            user_id=app.user_id
138        )

继承时要书写__table_name__

主键有且仅有 group_id, user_id

使用前先调用classmethod def create_table

Inherited Members
AyakaDB
AyakaDB
dict
drop_table
create_table
replace
save
replace_many
insert
insert_many
select_many
select_one
get_db
ayaka.depend.depend.AyakaDepend
props
pydantic.main.BaseModel
json
parse_obj
parse_raw
parse_file
from_orm
construct
copy
schema
schema_json
validate
update_forward_refs