ysql


Nameysql JSON
Version 1.1.2 PyPI version JSON
download
home_pagehttps://gitee.com/darlingxyz/ysql
Summarybased on android room, developed a better sqlite frame
upload_time2023-09-24 11:17:59
maintainer
docs_urlNone
authordfqxhhh
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.设计分析

![框架设计](asset/design.svg)

**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.使用建议

![推荐编写结构](asset/advice.svg)

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![\u6846\u67b6\u8bbe\u8ba1](asset/design.svg)\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![\u63a8\u8350\u7f16\u5199\u7ed3\u6784](asset/advice.svg)\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"
}
        
Elapsed time: 0.20664s