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 )
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)
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
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
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创建,创建后自动写入数据库
Inherited Members
- pydantic.main.BaseModel
- json
- parse_obj
- parse_raw
- parse_file
- from_orm
- construct
- copy
- schema
- schema_json
- validate
- update_forward_refs
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
- pydantic.main.BaseModel
- json
- parse_obj
- parse_raw
- parse_file
- from_orm
- construct
- copy
- schema
- schema_json
- validate
- update_forward_refs
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
- pydantic.main.BaseModel
- json
- parse_obj
- parse_raw
- parse_file
- from_orm
- construct
- copy
- schema
- schema_json
- validate
- update_forward_refs