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 )
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
create_table(cls):
65 @classmethod 66 def create_table(cls): 67 '''根据数据类型自动创建表''' 68 create_table(cls.__table_name__, cls)
根据数据类型自动创建表
@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创建
Inherited Members
- pydantic.main.BaseModel
- json
- parse_obj
- parse_raw
- parse_file
- from_orm
- construct
- copy
- schema
- schema_json
- validate
- update_forward_refs
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
- pydantic.main.BaseModel
- json
- parse_obj
- parse_raw
- parse_file
- from_orm
- construct
- copy
- schema
- schema_json
- validate
- update_forward_refs
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
- pydantic.main.BaseModel
- json
- parse_obj
- parse_raw
- parse_file
- from_orm
- construct
- copy
- schema
- schema_json
- validate
- update_forward_refs