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

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

@classmethod
def drop_table(cls):
60    @classmethod
61    def drop_table(cls):
62        drop_table(cls.__table_name__)
@classmethod
def create_table(cls):
64    @classmethod
65    def create_table(cls):
66        '''根据数据类型自动创建表'''
67        if not cls.__created__:
68            if not cls.__table_name__:
69                raise Exception("__table_name__不可为空")
70            cls.__created__ = True
71            create_table(cls.__table_name__, cls)

根据数据类型自动创建表

@classmethod
def replace(cls, data: typing_extensions.Self):
73    @classmethod
74    def replace(cls, data: Self):
75        cls.create_table()
76        insert_or_replace(cls.__table_name__, data, "replace")
def save(self):
78    def save(self):
79        '''写入数据库'''
80        self.replace(self)

写入数据库

@classmethod
def replace_many(cls, datas: List[typing_extensions.Self]):
82    @classmethod
83    def replace_many(cls, datas: List[Self]):
84        cls.create_table()
85        insert_or_replace_many(cls.__table_name__, datas, "replace")
@classmethod
def insert(cls, data: typing_extensions.Self):
87    @classmethod
88    def insert(cls, data: Self):
89        cls.create_table()
90        insert_or_replace(cls.__table_name__, data, "insert")
@classmethod
def insert_many(cls, datas: List[typing_extensions.Self]):
92    @classmethod
93    def insert_many(cls, datas: List[Self]):
94        cls.create_table()
95        insert_or_replace_many(cls.__table_name__, datas, "insert")
@classmethod
def select_many(cls, **params) -> List[typing_extensions.Self]:
 97    @classmethod
 98    def select_many(cls, **params) -> List[Self]:
 99        '''按照params的值搜索数据,返回数据列表,若没有符合的数据则返回空列表'''
100        where = "1"
101        if params:
102            where = " and ".join(f"{k}={wrap(v)}" for k, v in params.items())
103        cls.create_table()
104        return select_many(cls.__table_name__, cls, where)

按照params的值搜索数据,返回数据列表,若没有符合的数据则返回空列表

@classmethod
def select_one(cls, **params):
106    @classmethod
107    def select_one(cls, **params):
108        '''按照params的值搜索数据,返回一项数据,若不存在,则自动根据params创建,创建后自动写入数据库'''
109        datas = cls.select_many(**params)
110        if datas:
111            return datas[0]
112        data = cls(**params)
113        data.save()
114        return data

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

@classmethod
def get_db(cls):
116    @classmethod
117    def get_db(cls):
118        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):
121class AyakaGroupDB(AyakaDB):
122    '''继承时要书写`__table_name__`
123
124    主键有且仅有 group_id'''
125    group_id: int = Field(extra=AyakaDB.__primary_key__)
126
127    @classmethod
128    async def _create_by_app(cls, app: "AyakaApp"):
129        return cls.select_one(group_id=app.group_id)

继承时要书写__table_name__

主键有且仅有 group_id

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):
132class AyakaUserDB(AyakaDB):
133    '''继承时要书写`__table_name__`
134
135    主键有且仅有 group_id, user_id'''
136    group_id: int = Field(extra=AyakaDB.__primary_key__)
137    user_id: int = Field(extra=AyakaDB.__primary_key__)
138
139    @classmethod
140    async def _create_by_app(cls, app: "AyakaApp"):
141        return cls.select_one(
142            group_id=app.group_id,
143            user_id=app.user_id
144        )

继承时要书写__table_name__

主键有且仅有 group_id, user_id

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