Name | ysql JSON |
Version |
1.1.2
JSON |
| download |
home_page | https://gitee.com/darlingxyz/ysql |
Summary | based on android room, developed a better sqlite frame |
upload_time | 2023-09-24 11:17:59 |
maintainer | |
docs_url | None |
author | dfqxhhh |
requires_python | |
license | |
keywords |
|
VCS |
|
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
# ysql框架
项目地址:[ysql (gitee.com)](https://gitee.com/darlingxyz/ysql)
### **1.开发环境**
| IDE | 开发语言 | 主要使用 | 第三方库依赖 |
| :--------------------------------: | :-------: | :------: | :----------: |
| PyCharm Community Edition 2020.3.4 | Python3.9 | sqlite3 | 无 |
基于Python官方库实现的Sqlite数据库框架,借鉴了安卓Room框架的设计,进行了一些个人理解上的设计优化。
### 2.使用方式
**方式1**:通过pip安装
```
pip install ysql
```
然后在python中使用以下函数来获取示例文件
```
from ysql import get_example
get_example()
```
**方式2**:通过gitee下载项目源码,将ysql文件夹放置到项目根目录中,如使用pycharm则应与venv目录同级。
### 3.设计分析

**Entity**:基于python内置的dataclass类和本框架定义的Entity装饰器共同实现。由于采取装饰器和使用元编程、描述符向该类中增添功能,但装饰后的数据类仍然是独立完整的dataclass,与其他结构解耦,可以单独使用。
**Dao**:通过Dao装饰器注册该类对应的Entity类;隐藏了cursor对象的使用,用户只需关心数据库的connection;对类方法提供了Sql装饰器,仅需传递sql语句,无需具体实现该方法;提供了insert装饰器以及默认的insert方法,可以直接插入对硬的数据类对象至数据库中。
**Database**:通过将Dao类写为类中静态变量来集成全部的Dao类,是对外访问的唯一接口;具体通过继承MetaDatabase,以及Path装饰器传递数据库路径实现(由于装饰器是动态生成属性,在静态开发的时候不利于IDE的自动补全,因此采取了继承的策略)。
### 4.特性介绍
**特性1**:整体操作分为表定义(Entity)、表操作(Dao)、库操作(Database)三种,由Entity到Dao再到Database,层层向上,不存在越级关系,模块解耦程度高。
**特性2**:Entity和Dao均采用装饰器方式实现,避免了大量的约定规则,仅需添加一行代码。
```python
@Entity # 使用Entity装饰器
@dataclass # 指定为原生的dataclass数据类
class Student:
score: float
picture: bytes
name: str = '好家伙', Constraint.not_null # 同时设置默认值和约束,以逗号分开即可
student_id: int = Constraint.auto_primary_key # Constraint类提供多种字段约束
```
**特性3**:Dao中实现了@Insert和@Sql两个装饰器。Dao类仅需定义方法名称和参数,并在@Sql装饰器中编写原生sql语句即可,Dao装饰器将自动实现其余代码。
```python
@Dao(Student) # 通过Dao装饰器传入对应的数据类
class DaoStudent:
# 已内置insert(entity)方法,可直接调用DaoStudent().insert(entity),参数entity应为对应数据类的实例,返回值为刚插入记录的row id
@Sql("select name, score, picture from student where student_id=?;") # 通过Sql装饰器传递标准sql语句
def get_student(self, student_id):
pass # 装饰器会自动实现该方法
# 使用select的时候返回结果为list[named_tuple],其中每条记录会自动解析为具名元组。
```
**特性4**:@Sql装饰器自动转换查询结果为具名元组,无论编写的sql语句查询的是*还是指定字段,@Sql将解析并转换各个查询字段名,并生成具名元组来存储单条记录(全部查询结果使用列表存储)。避免了在应用层直接使用结果元组或者字典,改动数据结构时可以大大降低对应用层的影响。
### 5.使用建议

1.分文件编写各个Entity,可避免容易发生的引用问题。
2.将Entity与对应Dao写入同一文件中。
3.Dao类仅实现基础的操作方法,将复杂操作放至DataRepo中进行。
### 6.待开发
1.导出数据库结构,并实现表的可视化。
2.测试并解决Database单例模式和多线程的冲突。
3.完善异常捕捉。
**作者**:大风起兮呼呼呼
**邮箱**:dfqxhhh@163.com
**时间**:2023-9-9
Raw data
{
"_id": null,
"home_page": "https://gitee.com/darlingxyz/ysql",
"name": "ysql",
"maintainer": "",
"docs_url": null,
"requires_python": "",
"maintainer_email": "",
"keywords": "",
"author": "dfqxhhh",
"author_email": "dfqxhhh@163.com",
"download_url": "https://files.pythonhosted.org/packages/ae/4a/97f14de058e99b12f9648167182df4f45ad0aac74ed2caa217bfef8758ce/ysql-1.1.2.tar.gz",
"platform": null,
"description": "# ysql\u6846\u67b6\r\n\r\n\u9879\u76ee\u5730\u5740\uff1a[ysql (gitee.com)](https://gitee.com/darlingxyz/ysql)\r\n\r\n### **1.\u5f00\u53d1\u73af\u5883**\r\n\r\n| IDE | \u5f00\u53d1\u8bed\u8a00 | \u4e3b\u8981\u4f7f\u7528 | \u7b2c\u4e09\u65b9\u5e93\u4f9d\u8d56 |\r\n| :--------------------------------: | :-------: | :------: | :----------: |\r\n| PyCharm Community Edition 2020.3.4 | Python3.9 | sqlite3 | \u65e0 |\r\n\r\n\u57fa\u4e8ePython\u5b98\u65b9\u5e93\u5b9e\u73b0\u7684Sqlite\u6570\u636e\u5e93\u6846\u67b6\uff0c\u501f\u9274\u4e86\u5b89\u5353Room\u6846\u67b6\u7684\u8bbe\u8ba1\uff0c\u8fdb\u884c\u4e86\u4e00\u4e9b\u4e2a\u4eba\u7406\u89e3\u4e0a\u7684\u8bbe\u8ba1\u4f18\u5316\u3002\r\n\r\n\r\n\r\n### 2.\u4f7f\u7528\u65b9\u5f0f\r\n\r\n**\u65b9\u5f0f1**\uff1a\u901a\u8fc7pip\u5b89\u88c5\r\n\r\n```\r\npip install ysql\r\n```\r\n\r\n\u7136\u540e\u5728python\u4e2d\u4f7f\u7528\u4ee5\u4e0b\u51fd\u6570\u6765\u83b7\u53d6\u793a\u4f8b\u6587\u4ef6\r\n\r\n```\r\nfrom ysql import get_example\r\n\r\nget_example()\r\n```\r\n\r\n**\u65b9\u5f0f2**\uff1a\u901a\u8fc7gitee\u4e0b\u8f7d\u9879\u76ee\u6e90\u7801\uff0c\u5c06ysql\u6587\u4ef6\u5939\u653e\u7f6e\u5230\u9879\u76ee\u6839\u76ee\u5f55\u4e2d\uff0c\u5982\u4f7f\u7528pycharm\u5219\u5e94\u4e0evenv\u76ee\u5f55\u540c\u7ea7\u3002\r\n\r\n\r\n\r\n### 3.\u8bbe\u8ba1\u5206\u6790\r\n\r\n\r\n\r\n**Entity**\uff1a\u57fa\u4e8epython\u5185\u7f6e\u7684dataclass\u7c7b\u548c\u672c\u6846\u67b6\u5b9a\u4e49\u7684Entity\u88c5\u9970\u5668\u5171\u540c\u5b9e\u73b0\u3002\u7531\u4e8e\u91c7\u53d6\u88c5\u9970\u5668\u548c\u4f7f\u7528\u5143\u7f16\u7a0b\u3001\u63cf\u8ff0\u7b26\u5411\u8be5\u7c7b\u4e2d\u589e\u6dfb\u529f\u80fd\uff0c\u4f46\u88c5\u9970\u540e\u7684\u6570\u636e\u7c7b\u4ecd\u7136\u662f\u72ec\u7acb\u5b8c\u6574\u7684dataclass\uff0c\u4e0e\u5176\u4ed6\u7ed3\u6784\u89e3\u8026\uff0c\u53ef\u4ee5\u5355\u72ec\u4f7f\u7528\u3002\r\n\r\n**Dao**\uff1a\u901a\u8fc7Dao\u88c5\u9970\u5668\u6ce8\u518c\u8be5\u7c7b\u5bf9\u5e94\u7684Entity\u7c7b\uff1b\u9690\u85cf\u4e86cursor\u5bf9\u8c61\u7684\u4f7f\u7528\uff0c\u7528\u6237\u53ea\u9700\u5173\u5fc3\u6570\u636e\u5e93\u7684connection\uff1b\u5bf9\u7c7b\u65b9\u6cd5\u63d0\u4f9b\u4e86Sql\u88c5\u9970\u5668\uff0c\u4ec5\u9700\u4f20\u9012sql\u8bed\u53e5\uff0c\u65e0\u9700\u5177\u4f53\u5b9e\u73b0\u8be5\u65b9\u6cd5\uff1b\u63d0\u4f9b\u4e86insert\u88c5\u9970\u5668\u4ee5\u53ca\u9ed8\u8ba4\u7684insert\u65b9\u6cd5\uff0c\u53ef\u4ee5\u76f4\u63a5\u63d2\u5165\u5bf9\u786c\u7684\u6570\u636e\u7c7b\u5bf9\u8c61\u81f3\u6570\u636e\u5e93\u4e2d\u3002\r\n\r\n**Database**\uff1a\u901a\u8fc7\u5c06Dao\u7c7b\u5199\u4e3a\u7c7b\u4e2d\u9759\u6001\u53d8\u91cf\u6765\u96c6\u6210\u5168\u90e8\u7684Dao\u7c7b\uff0c\u662f\u5bf9\u5916\u8bbf\u95ee\u7684\u552f\u4e00\u63a5\u53e3\uff1b\u5177\u4f53\u901a\u8fc7\u7ee7\u627fMetaDatabase\uff0c\u4ee5\u53caPath\u88c5\u9970\u5668\u4f20\u9012\u6570\u636e\u5e93\u8def\u5f84\u5b9e\u73b0\uff08\u7531\u4e8e\u88c5\u9970\u5668\u662f\u52a8\u6001\u751f\u6210\u5c5e\u6027\uff0c\u5728\u9759\u6001\u5f00\u53d1\u7684\u65f6\u5019\u4e0d\u5229\u4e8eIDE\u7684\u81ea\u52a8\u8865\u5168\uff0c\u56e0\u6b64\u91c7\u53d6\u4e86\u7ee7\u627f\u7684\u7b56\u7565\uff09\u3002\r\n\r\n\r\n\r\n### 4.\u7279\u6027\u4ecb\u7ecd\r\n\r\n**\u7279\u60271**\uff1a\u6574\u4f53\u64cd\u4f5c\u5206\u4e3a\u8868\u5b9a\u4e49(Entity)\u3001\u8868\u64cd\u4f5c(Dao)\u3001\u5e93\u64cd\u4f5c(Database)\u4e09\u79cd\uff0c\u7531Entity\u5230Dao\u518d\u5230Database\uff0c\u5c42\u5c42\u5411\u4e0a\uff0c\u4e0d\u5b58\u5728\u8d8a\u7ea7\u5173\u7cfb\uff0c\u6a21\u5757\u89e3\u8026\u7a0b\u5ea6\u9ad8\u3002\r\n\r\n**\u7279\u60272**\uff1aEntity\u548cDao\u5747\u91c7\u7528\u88c5\u9970\u5668\u65b9\u5f0f\u5b9e\u73b0\uff0c\u907f\u514d\u4e86\u5927\u91cf\u7684\u7ea6\u5b9a\u89c4\u5219\uff0c\u4ec5\u9700\u6dfb\u52a0\u4e00\u884c\u4ee3\u7801\u3002\r\n\r\n```python\r\n@Entity # \u4f7f\u7528Entity\u88c5\u9970\u5668\r\n@dataclass # \u6307\u5b9a\u4e3a\u539f\u751f\u7684dataclass\u6570\u636e\u7c7b\r\nclass Student:\r\n score: float\r\n picture: bytes\r\n name: str = '\u597d\u5bb6\u4f19', Constraint.not_null # \u540c\u65f6\u8bbe\u7f6e\u9ed8\u8ba4\u503c\u548c\u7ea6\u675f\uff0c\u4ee5\u9017\u53f7\u5206\u5f00\u5373\u53ef\r\n student_id: int = Constraint.auto_primary_key # Constraint\u7c7b\u63d0\u4f9b\u591a\u79cd\u5b57\u6bb5\u7ea6\u675f\r\n```\r\n\r\n**\u7279\u60273**\uff1aDao\u4e2d\u5b9e\u73b0\u4e86@Insert\u548c@Sql\u4e24\u4e2a\u88c5\u9970\u5668\u3002Dao\u7c7b\u4ec5\u9700\u5b9a\u4e49\u65b9\u6cd5\u540d\u79f0\u548c\u53c2\u6570\uff0c\u5e76\u5728@Sql\u88c5\u9970\u5668\u4e2d\u7f16\u5199\u539f\u751fsql\u8bed\u53e5\u5373\u53ef\uff0cDao\u88c5\u9970\u5668\u5c06\u81ea\u52a8\u5b9e\u73b0\u5176\u4f59\u4ee3\u7801\u3002\r\n\r\n```python\r\n@Dao(Student) # \u901a\u8fc7Dao\u88c5\u9970\u5668\u4f20\u5165\u5bf9\u5e94\u7684\u6570\u636e\u7c7b\r\nclass DaoStudent:\r\n # \u5df2\u5185\u7f6einsert(entity)\u65b9\u6cd5\uff0c\u53ef\u76f4\u63a5\u8c03\u7528DaoStudent().insert(entity)\uff0c\u53c2\u6570entity\u5e94\u4e3a\u5bf9\u5e94\u6570\u636e\u7c7b\u7684\u5b9e\u4f8b\uff0c\u8fd4\u56de\u503c\u4e3a\u521a\u63d2\u5165\u8bb0\u5f55\u7684row id\r\n\r\n @Sql(\"select name, score, picture from student where student_id=?;\") # \u901a\u8fc7Sql\u88c5\u9970\u5668\u4f20\u9012\u6807\u51c6sql\u8bed\u53e5\r\n def get_student(self, student_id):\r\n pass # \u88c5\u9970\u5668\u4f1a\u81ea\u52a8\u5b9e\u73b0\u8be5\u65b9\u6cd5\r\n # \u4f7f\u7528select\u7684\u65f6\u5019\u8fd4\u56de\u7ed3\u679c\u4e3alist[named_tuple]\uff0c\u5176\u4e2d\u6bcf\u6761\u8bb0\u5f55\u4f1a\u81ea\u52a8\u89e3\u6790\u4e3a\u5177\u540d\u5143\u7ec4\u3002\r\n```\r\n\r\n**\u7279\u60274**\uff1a@Sql\u88c5\u9970\u5668\u81ea\u52a8\u8f6c\u6362\u67e5\u8be2\u7ed3\u679c\u4e3a\u5177\u540d\u5143\u7ec4\uff0c\u65e0\u8bba\u7f16\u5199\u7684sql\u8bed\u53e5\u67e5\u8be2\u7684\u662f*\u8fd8\u662f\u6307\u5b9a\u5b57\u6bb5\uff0c@Sql\u5c06\u89e3\u6790\u5e76\u8f6c\u6362\u5404\u4e2a\u67e5\u8be2\u5b57\u6bb5\u540d\uff0c\u5e76\u751f\u6210\u5177\u540d\u5143\u7ec4\u6765\u5b58\u50a8\u5355\u6761\u8bb0\u5f55\uff08\u5168\u90e8\u67e5\u8be2\u7ed3\u679c\u4f7f\u7528\u5217\u8868\u5b58\u50a8\uff09\u3002\u907f\u514d\u4e86\u5728\u5e94\u7528\u5c42\u76f4\u63a5\u4f7f\u7528\u7ed3\u679c\u5143\u7ec4\u6216\u8005\u5b57\u5178\uff0c\u6539\u52a8\u6570\u636e\u7ed3\u6784\u65f6\u53ef\u4ee5\u5927\u5927\u964d\u4f4e\u5bf9\u5e94\u7528\u5c42\u7684\u5f71\u54cd\u3002\r\n\r\n\r\n\r\n### 5.\u4f7f\u7528\u5efa\u8bae\r\n\r\n\r\n\r\n1.\u5206\u6587\u4ef6\u7f16\u5199\u5404\u4e2aEntity\uff0c\u53ef\u907f\u514d\u5bb9\u6613\u53d1\u751f\u7684\u5f15\u7528\u95ee\u9898\u3002\r\n\r\n2.\u5c06Entity\u4e0e\u5bf9\u5e94Dao\u5199\u5165\u540c\u4e00\u6587\u4ef6\u4e2d\u3002\r\n\r\n3.Dao\u7c7b\u4ec5\u5b9e\u73b0\u57fa\u7840\u7684\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5c06\u590d\u6742\u64cd\u4f5c\u653e\u81f3DataRepo\u4e2d\u8fdb\u884c\u3002\r\n\r\n\r\n\r\n### 6.\u5f85\u5f00\u53d1\r\n\r\n1.\u5bfc\u51fa\u6570\u636e\u5e93\u7ed3\u6784\uff0c\u5e76\u5b9e\u73b0\u8868\u7684\u53ef\u89c6\u5316\u3002\r\n\r\n2.\u6d4b\u8bd5\u5e76\u89e3\u51b3Database\u5355\u4f8b\u6a21\u5f0f\u548c\u591a\u7ebf\u7a0b\u7684\u51b2\u7a81\u3002\r\n\r\n3.\u5b8c\u5584\u5f02\u5e38\u6355\u6349\u3002\r\n\r\n\r\n\r\n**\u4f5c\u8005**\uff1a\u5927\u98ce\u8d77\u516e\u547c\u547c\u547c\r\n\r\n**\u90ae\u7bb1**\uff1adfqxhhh@163.com\r\n\r\n**\u65f6\u95f4**\uff1a2023-9-9\r\n\r\n",
"bugtrack_url": null,
"license": "",
"summary": "based on android room, developed a better sqlite frame",
"version": "1.1.2",
"project_urls": {
"Homepage": "https://gitee.com/darlingxyz/ysql"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "bb6dccb23b6b98cc6fba841023025dec10c8e440b7af76810dc007dacef23fc7",
"md5": "a948ae12917df0ffb0a354f29b163935",
"sha256": "2ff21467def951aaf3d57f289f48942064480f08d54b76504cc02825a8ba0c83"
},
"downloads": -1,
"filename": "ysql-1.1.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "a948ae12917df0ffb0a354f29b163935",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 14715,
"upload_time": "2023-09-24T11:17:57",
"upload_time_iso_8601": "2023-09-24T11:17:57.538931Z",
"url": "https://files.pythonhosted.org/packages/bb/6d/ccb23b6b98cc6fba841023025dec10c8e440b7af76810dc007dacef23fc7/ysql-1.1.2-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "ae4a97f14de058e99b12f9648167182df4f45ad0aac74ed2caa217bfef8758ce",
"md5": "3bdd8e66199bf773211ea25fc892519a",
"sha256": "eb704009fe2e3b349645fe15f0f6dbe43fe396563d2f8dd459cb6a84b390206b"
},
"downloads": -1,
"filename": "ysql-1.1.2.tar.gz",
"has_sig": false,
"md5_digest": "3bdd8e66199bf773211ea25fc892519a",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 12684,
"upload_time": "2023-09-24T11:17:59",
"upload_time_iso_8601": "2023-09-24T11:17:59.270866Z",
"url": "https://files.pythonhosted.org/packages/ae/4a/97f14de058e99b12f9648167182df4f45ad0aac74ed2caa217bfef8758ce/ysql-1.1.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-09-24 11:17:59",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "ysql"
}