asymysql


Nameasymysql JSON
Version 1.4.0.4 PyPI version JSON
download
home_pageNone
Summary异步的 mysql ORM
upload_time2023-11-26 05:08:23
maintainerNone
docs_urlNone
authorNone
requires_pythonNone
licenseNone
keywords coolmysql asymysql pymysql mysql aiomysql orm
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 项目描述

异步的 mysql ORM 。

# 作者信息

昵称:lcctoor.com

[主页](https://lcctoor.github.io/arts/) \| [微信](https://lcctoor.github.io/arts/arts/static/static-files/WeChatQRC.jpg) \| [Github](https://github.com/lcctoor) \| [PyPi](https://pypi.org/user/lcctoor) \| [Python交流群](https://lcctoor.github.io/arts/arts/static/static-files/PythonWeChatGroupQRC.jpg) \| [邮箱](mailto:lcctoor@outlook.com) \| [域名](http://lcctoor.com) \| [捐赠](https://lcctoor.github.io/arts/arts/static/static-files/DonationQRC-0rmb.jpg)

# Bug提交、功能提议

您可以通过 [Github-Issues](https://github.com/lcctoor/arts/issues)、[微信](https://lcctoor.github.io/arts/arts/static/static-files/WeChatQRC.jpg) 与我联系。

# 安装

```
pip install asymysql
```

# 教程 ([查看美化版](https://lcctoor.github.io/arts/?pk=asymysql)👈)

本文将以最简洁的方式向你介绍核心知识,而不会让你被繁琐的术语所淹没。

## 导入

```python
from aiomysql import connect
from asymysql import ORM, mc, mf
```

## 创建ORM

```python
async def mkconn():
    return await connect(
        host = 'localhost',
        port = 3306,
        user = 'root',
        password = '123456789'
    )

orm = await ORM(mkconn)  # 账户ORM
db = orm['泉州市']  # 库ORM
sheet = db['希望小学']  # 表ORM
```

## 新增数据

```python
line1 = {'姓名': '小一', '年龄':11, '签到日期':'2023-01-11'}
line2 = {'姓名': '小二', '年龄':12, '签到日期':'2023-01-12'}
line3 = {'姓名': '小三', '年龄':13, '签到日期':'2023-01-13'}
line4 = {'姓名': '小四', '年龄':14, '签到日期':'2023-01-14'}
line5 = {'姓名': '小五', '年龄':15, '签到日期':'2023-01-15'}
line6 = {'姓名': '小六', '年龄':16, '签到日期':'2023-01-16'}

r1 = await sheet.insert(line1)  # 添加1条数据
r2 = await sheet.insert([ line2, line3, line4, line5, line6 ])  # 批量添加
```

查看分配到的主键:

```python
r1.lastrowid
r2.lastrowid
```

## 查询示例

```python
await sheet[:]  # 查询所有数据

await sheet[3]  # 查询第3条数据

await sheet[mc.年龄>13][mc.姓名=='小五'][1]  # 查询年龄大于13、且姓名叫'小五'的第1条数据
```

注:后文有关于查询的详细教程。

## 修改

### 批量修改

```python
data = {
    '视力': 5.0,
    '性别': '男',
    '爱好': '足球,篮球,画画,跳绳'
}

r = await sheet[mc.年龄>11].update(data)[2:5]  # 修改符合条件的第2~5条数据

r.rowcount  # 查看修改详情
```

### 按主键修改

```python
data = {
    2: {'姓名':'xiao二', '年龄':20},
    3: {'年级':'三年级'},
    4: {'id':400, '视力':4.0}
}

await sheet.update_by_pk(data)
```

### 用自定义函数修改

```python
def handler(row:dict):
    row['年龄'] += 1  # 年龄统一加1岁
    if row['爱好'] == '打篮球':
        row['身高'] = 180
    elif row['爱好'] == '玩手机':
        row['视力'] = 1.8
    row['姓名'] = row['姓名'].replace('小', 'xiao')

await sheet[mc.年龄>11].apply(handler)[:]  # 修改符合条件的所有数据
await sheet[mc.年龄>11].apply(handler)[2:-2]  # 修改符合条件的第2条~倒数第2条
await sheet[mc.年龄>11].apply(handler)[2]  # 修改符合条件的第2条数据
```

注:

1、传递给 apply 方法的函数必须接收且仅接收1个参数,参数名可以不是‘row’。

2、可只提取需要的字段以提升性能。比如在上例中,handler 函数只使用到年龄、爱好、姓名这3个字段,可改为 `await sheet[mc.年龄>11]['年龄', '爱好', '姓名'].apply(handler)[:]` 以提高性能。

3、ORM 会自动对比修改前与修改后的数据差异,只提交差异部分到数据库。

## 删除

```python
# 删除年龄>=15的所有数据
r1 = await sheet[mc.年龄>=15].delete()[:]

# 删除年龄大于10、且喜欢足球的第2条数据
r2 = await sheet[mc.年龄>10][mc.爱好.re('足球')].delete()[2]

# 删除所有数据
r3 = await sheet.delete()[:]

# 查看删除详情
r1.rowcount
r2.rowcount
r3.rowcount
```

## 切片

1、切片格式为  [start: stop: step]  ,start 表示从哪条开始,stop 表示到哪条停止,step 表示步长。

2、start 和 stop

* 当为正值时,表示正序第 x 条,例如:1 表示第 1 条、2 表示第 2 条。
* 当为负值时,表示倒数第 x 条,例如:-1 表示倒数第 1 条、-2 表示倒数第 2 条。
* 不可为 0 。

3、step

* 须为正整数。
* 当 step >= 2  时表示间隔式切片。
* 当 step = 1 时可省略 `: step` ,即:[start: stop] 等价于 [start: stop: 1] 。

4、与 Python 切片风格对比

此 ORM 的切片风格比 Python 切片风格更人性化。具体区别为:

|                                        | **Python**                                            | **asymysql**                                         |
| -------------------------------------- | ----------------------------------------------------------- | ----------------------------------------------------------- |
| **索引**                         | 从 0 开始,例如:<br />[0] 表示第 1 个元素、[1] 表示第 2 个元素 | 从 1 开始,例如:<br />[1] 表示第 1 个元素、[2] 表示第 2 个元素 |
| **切片**                         | 左闭右开区间,例如:<br />[3: 5] 表示第 4~5 这 2 个元素     | 双闭区间,例如:<br />[3: 5] 表示第 3~5 这 3 个元素         |
| **从右往**<br />**左切片** | step 为负值,例如:<br />[9: 1: -1] 表示第 9~3 这 7 个元素 | step 为正值,例如:<br />[9: 1: 1] 表示第 9~1 这 9 个元素   |

### 示例

```python
await sheet[过滤器]...[过滤器][:]  # 查询符合条件的全部数据
await sheet[过滤器]...[过滤器][:] = None  # 删除符合条件的全部数据
await sheet[过滤器]...[过滤器][:] = {'年级':'初一'}  # 修改符合条件的全部数据

await sheet[过滤器]...[过滤器][1]  # 查询符合条件的第1条
await sheet[过滤器]...[过滤器][1] = None  # 删除符合条件的第1条
await sheet[过滤器]...[过滤器][1] = {'年级':'初一'}  # 修改符合条件的第1条

await sheet[过滤器]...[过滤器][3:7]  # 查询符合条件的第3~7条
await sheet[过滤器]...[过滤器][3:7] = None  # 删除符合条件的第3~7条
await sheet[过滤器]...[过滤器][3:7] = {'年级':'初一'}  # 修改符合条件的第3~7条

await sheet[过滤器]...[过滤器][3:7:2]  # 查询符合条件的第3、5、7条
await sheet[过滤器]...[过滤器][3:7:2] = None  # 删除符合条件的第3、5、7条
await sheet[过滤器]...[过滤器][3:7:2] = {'年级':'初一'}  # 修改符合条件的第3、5、7条
```

值得注意的地方:  [3: 8: 2]  操作第  3、5、7  条,而  [8: 3: 2]  操作第  8、6、4  条。

更多示例:

```python
[:]           # 所有数据
[1:-1]        # 所有数据
[-1:1]        # 所有数据(逆序)
[1:]          # 所有数据
[:1000]       # 第1条 ~ 第1000条
[:-1000]      # 第1条 ~ 倒数第1000条
[100:200]     # 第100条 ~ 第200条
[200:100]     # 第200条 ~ 第100条
[-300:-2]     # 倒数第300条 ~ 倒数第2条
[50:-2]       # 第50条 ~ 倒数第2条
[250:]        # 第250条 ~ 最后1条
[-250:]       # 倒数第250条 ~ 最后1条
[1]           # 第1条
[-1]          # 最后1条
[::3]         # 以3为间距, 间隔操作所有数据
[100:200:4]   # 以4为间距, 间隔操作第100条 ~ 第200条
```

## 过滤器

过滤器的结构为 `mc.<字段名称><运算符><值>` ,例如 `mc.年龄 > 18` 。

### 比较运算

| **代码** |
| -------------- |
| mc.年龄 > 10   |
| mc.年龄 >= 10  |
| mc.年龄 < 10   |
| mc.年龄 <= 10  |
| mc.年龄 == 10  |
| mc.年龄 != 10  |

### 成员运算

| **代码**               | **解释**                   |
| ---------------------------- | -------------------------------- |
| mc.年级.isin('初三', '高二') | 若字段值是传入值的成员,则符合   |
| mc.年龄.notin(10, 30, 45)    | 若字段值不是传入值的成员,则符合 |

注:

1、isin、notin 的传入值都不必是同类型的数据,以isin为例:可以这样使用:  mc.tag.isin(3, 3.5, '学生', None)  ,传入值含有int型、float型、str型、None。

2、成员运算符未传入任何值时的处理方式:

| **代码**   | **处理方式** |
| ---------------- | ------------------ |
| mc.年级.isin( )  | 所有数据都 不符合  |
| mc.年级.notin( ) | 所有数据都 符合    |

### 正则运算

| **代码**   |
| ---------------- |
| mc.姓名.re('小') |

### 过滤器的集合运算

| **代码**                                                       | **解释** |
| -------------------------------------------------------------------- | -------------- |
| [ mc.年龄>3 ][ mc.年龄<100 ]                                         | 交集           |
| [ (mc.年龄<30)\| (mc.年龄>30) \| (mc.年龄==30) \| (mc.年龄==None) ] | 并集           |
| [ (mc.年龄>3) - (mc.年龄>100) ]                                      | 差集           |
| [ ~(mc.年龄>100) ]                                                   | 补集           |

注:四种集合运算可以相互嵌套,且可以无限嵌套。

### 特殊字段名的表示方法

MySQL支持各种特殊的字段名,如:数字、符号、emoji表情,这些字符在Python中不是合法变量名,使用  mc.1、mc.+  等格式会报错,可用  mc['1']、mc['+']  这种格式代替。

### 字段提示

变量 mc 无字段提示功能,输入‘mc.’后,编辑器不会提示可选字段。后文有关于如何设置字段提示的内容。

## 查询

### 限定返回字段

只返回姓名、年龄这2个字段:

```python
await sheet[mc.年级=='高一']['姓名','年龄'][:]
```

注:

1、字段限定器可放在sheet与[:]之间的任意位置。以下3行代码的返回结果相同:

```python
await sheet[mc.年龄>11][mc.年龄<30]['姓名', '年龄'][:]
await sheet[mc.年龄>11]['姓名', '年龄'][mc.年龄<30][:]
await sheet['姓名', '年龄'][mc.年龄>11][mc.年龄<30][:]
```

2、可反复限定字段,查询时是根据最后1次指定的字段提取数据。以下代码返回结果中只有‘年龄’字段:

```python
await sheet[mc.年级=='高一']['姓名']['年龄'][:]
```

3、若想恢复提取全部字段,则限定字段为 '\*'  ,'\*'即代表“全部字段”。

```python
await sheet[mc.年级=='高一']['姓名']['*'][:]
```

(为什么有时候要先限定字段,然后再取消限定,而不是一开始就不限定字段?这是因为在某些场景中这样做可以使代码整体上更优雅。参见后文 [ 如何写出优雅的代码 ](#如何写出优雅的代码) )

### 1个复杂的查询示例

```python
_ = sheet
_ = _[mc.年龄>=12]  # 比较
_ = _[mc.姓名.isin('小三','小四')]  # 被包含
_ = _[mc.姓名.notin('十三','十四')]  # 不被包含
_ = _[(mc.年龄==15) | (mc.年龄>15) | (mc.年龄<15)]  # 并集
_ = _[mc.年龄>=3][mc.年龄<100]  # 交集
_ = _[(mc.年龄>=3) - (mc.年龄>100)]  # 差集
_ = _[~ (mc.年龄>100)]  # 补集
_ = _[mc.姓名.re('小')]  # 正则表达式
await _[:]  # 切片
```

注:无论过滤器多复杂,ORM都不会访问数据库,只有在最后切片时,ORM才会访问数据库。

## 排序

对所有年级为“高一”的数据,优先按年龄降序,其次按姓名升序,排序后返回第2\~4条数据:

```python
await sheet[mc.年级=='高一'].order(年龄=False, 姓名=True)[2:4]
```

有趣的,以下两行代码的返回结果相同:

```python
await sheet[mc.年级=='高一'].order(年龄=True)[1:-1]

await sheet[mc.年级=='高一'].order(年龄=False)[-1:1]
```

解释:order(年龄=False)表示按年龄降序,[-1:1]表示逆序切片,产生了类似‘负负得正’的效果。

注:

1、排序器可放在sheet与[:]之间的任意位置。以下3行代码的返回结果相同:

```python
await sheet[mc.年级=='高一'][mc.视力>4.8].order(年龄=False)[2:4]
await sheet[mc.年级=='高一'].order(年龄=False)[mc.视力>4.8][2:4]
await sheet.order(年龄=False)[mc.年级=='高一'][mc.视力>4.8][2:4]
```

2、可反复排序,查询\|修改\|删除 时是根据最后1次指定的顺序提取数据。以下代码最终是按年龄降序后提取数据:

```python
await sheet.order(年龄=True, 姓名=False).order(年龄=False)[:]
```

3、若想取消排序,则再次调用order方法,但不传入任何值。

```python
await sheet.order(年龄=True, 姓名=False).order()[:]
```

(为什么有时候要先排序,然后再取消排序,而不是一开始就不排序?这是因为在某些场景中这样做可以使代码整体上更优雅。参见后文 [ 如何写出优雅的代码 ](#如何写出优雅的代码) )

## 统计

| **项目**  | **语法**                 | **返回**                                          |
| --------------- | ------------------------------ | ------------------------------------------------------- |
| 主键            | await sheet.get_pk( )           | 'id'                                                    |
| 所有字段        | await sheet.get_columns( )      | [{'name':'id', 'comment':'', 'type':'int'}, {...}, ...] |
| 数据总量        | await sheet.len( )             | 0                                                       |
| 年龄>10的数据量 | await sheet[mc.年龄>10].len( ) | 0                                                       |

## orm(账户ORM)

| **功能**   | **语法**          | **返回**                                                         |
| ---------------- | ----------------------- | ---------------------------------------------------------------------- |
| 获取所有库的名称 | await orm.get_db_names( ) | ['information_schema', 'mysql', 'performance_schema', 'sys', '泉州市'] |
| 统计库的数量     | await orm.len( )        | 5                                                                      |

## db(库ORM)

| **功能**   | **语法**            | **返回** |
| ---------------- | ------------------------- | -------------- |
| 获取所有表的名称 | await db.get_sheet_names( ) | ['希望小学']   |
| 统计表的数量     | await db.len( )           | 1              |

## 调用mysql函数

调用mysql函数的语法为 `mf.<函数名称>(<参数>)<运算符><值>` 。

```python
# 在查询、删除、修改的条件中使用
await sheet[mf.year('签到日期') == 2023][:]
await sheet[mf.year('签到日期') == 2029].delete()[:]
await sheet[mf.year('签到日期') == 2023].update({'性别':'女'})[:]

# 在修改中作为新值
await sheet.update({'备注': '签到日期'})[:]  # 修改为'签到日期'这个字符串
await sheet.update({'备注': mc.签到日期})[:]  # 修改为各自的'签到日期'字段的值
await sheet.update({'备注': mf.year('签到日期')})[:]  # 修改为各自的'签到日期'字段的值经year处理后的值
```

使用该语法可调用mysql的任意函数。

ORM已添加了(20几个)mysql常用函数的函数名提示,输入‘mf.’后,编辑器会提示可选函数名。如有需要,可添加更多提示,参见后文 [ mysql函数名提示 ](#mysql函数名提示) 。(不添加提示也不会影响调用。)

## 执行原生SQL语句

```python
data, cursor = await sheet.execute('select 姓名 from 希望小学 limit 1')
data
# >>> [{'姓名': '小一'}]

data, cursor = await sheet.execute('update 希望小学 set 爱好="编程" limit 3')
cursor.rowcount
# >>> 3

data, cursor = await sheet.execute("delete from 希望小学 limit 2")
cursor.rowcount
# >>> 2

sql = 'insert into 希望小学(姓名, 年龄) values (%s, %s)'
students = [('小七', 17), ('小八', 18)]
data, cursor = await sheet.executemany(sql, students)
cursor.lastrowid
# >>> 8
```

## 关闭mysql连接

对 orm、db、sheet 中的任意一个调用 close( ) 方法即可。

```python
await orm.close()

# 或者:
await db.close()

# 或者:
await sheet.close()
```

注:

1、关闭 mysql 连接后,orm、db、sheet 都可以再使用。当再次使用时,ORM 会调用 mkconn 方法创建一个新连接。

2、调用 orm.close( )、db.close( )、sheet.close( )  中的 1 个即可。若多次调用,ORM 会创建一个新连接,然后再关闭这个新连接。

3、若长时间没有调用 orm、db、sheet 中的任意一个,mysql 连接也会断开,这是 mysql 自身的机制。这不会影响这三者的后续使用,当再次调用它们时,ORM 会自动重新连接 mysql 。

## 代码提示

### 字段提示

变量 mc 无字段提示功能,输入‘mc.’后,编辑器不会提示可选字段。

为了获得字段提示功能,可自建一个‘mc2’:

```python
class mc2(mc):
    姓名 = 年龄 = 签到日期 = 年级 = 爱好 = None

await sheet[mc2.年龄 > 10][:]
```

注:

1、mc2 与 mc 用法完全一致,可混用。

2、mc2 与 mc 设置字段提示后,仅具备提示效果,而不产生任何实际约束。

### mysql函数名提示

ORM已添加了(20几个)mysql常用函数的函数名提示,输入‘mf.’后,编辑器会提示可选函数名。如有需要,可添加更多提示:

```python
class mf2(mf):
    reverse = length = lower = upper = None

await sheet[mf2.reverse('姓名') == '二小'][:]
```

注:

1、mf2 与 mf 用法完全一致,可混用。

2、mf2 与 mf 设置函数名提示后,仅具备提示效果,而不产生任何实际约束。

## 表ORM的独立性

### 表ORM的独立性

先看一条查询示例:

```python
await sheet[mc.年龄 > 5]['姓名','年龄'][mc.姓名.re('小')].order(id=False)[:]
```

以上示例代码可改为如下(两者效果相同):

```python
d1 = sheet
d2 = d1[mc.年龄 > 5]
d3 = d2['姓名','年龄']
d4 = d3[mc.姓名.re('小')]
d5 = d4.order(id=False)
await d5[:]
```

以上代码中,d1\~d5是5个不同的表ORM,它们具有独立的数据空间(存放着过滤条件、字段限定、排序等信息),且互不干扰。d2\~d5每个都拷贝了前一个ORM的表空间,并增加了自身的新信息。

### 如何写出优雅的代码

利用表ORM的独立性,可以在一些复杂的场景中写出优雅简洁的代码。

不优雅的示范:

```python
def GetName():
    return requests.get('https://...').text

def output(datas):
    ...

while True:
    datas = await sheet[过滤器1][过滤器2]...[过滤器9][mc.name == GetName()][:]
    output(datas)
```

优雅的示范:

```python
def GetName():
    return requests.get('https://...').text

def output(datas):
    ...

baseSheet = sheet[过滤器1][过滤器2]...[过滤器9]
while True:
    datas = await baseSheet[mc.name == GetName()][:]
    output(datas)
```

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "asymysql",
    "maintainer": null,
    "docs_url": null,
    "requires_python": null,
    "maintainer_email": null,
    "keywords": "coolmysql,asymysql,pymysql,mysql,aiomysql,orm",
    "author": null,
    "author_email": "\"lcctoor.com\" <lcctoor@outlook.com>",
    "download_url": "https://files.pythonhosted.org/packages/70/5c/5ad98cdae40a7f4b9fd9835637d0b5caaad105184516090f4496b40ba970/asymysql-1.4.0.4.tar.gz",
    "platform": null,
    "description": "# \u9879\u76ee\u63cf\u8ff0\n\n\u5f02\u6b65\u7684 mysql ORM \u3002\n\n# \u4f5c\u8005\u4fe1\u606f\n\n\u6635\u79f0\uff1alcctoor.com\n\n[\u4e3b\u9875](https://lcctoor.github.io/arts/) \\| [\u5fae\u4fe1](https://lcctoor.github.io/arts/arts/static/static-files/WeChatQRC.jpg) \\| [Github](https://github.com/lcctoor) \\| [PyPi](https://pypi.org/user/lcctoor) \\| [Python\u4ea4\u6d41\u7fa4](https://lcctoor.github.io/arts/arts/static/static-files/PythonWeChatGroupQRC.jpg) \\| [\u90ae\u7bb1](mailto:lcctoor@outlook.com) \\| [\u57df\u540d](http://lcctoor.com) \\| [\u6350\u8d60](https://lcctoor.github.io/arts/arts/static/static-files/DonationQRC-0rmb.jpg)\n\n# Bug\u63d0\u4ea4\u3001\u529f\u80fd\u63d0\u8bae\n\n\u60a8\u53ef\u4ee5\u901a\u8fc7 [Github-Issues](https://github.com/lcctoor/arts/issues)\u3001[\u5fae\u4fe1](https://lcctoor.github.io/arts/arts/static/static-files/WeChatQRC.jpg) \u4e0e\u6211\u8054\u7cfb\u3002\n\n# \u5b89\u88c5\n\n```\npip install asymysql\n```\n\n# \u6559\u7a0b ([\u67e5\u770b\u7f8e\u5316\u7248](https://lcctoor.github.io/arts/?pk=asymysql)\ud83d\udc48)\n\n\u672c\u6587\u5c06\u4ee5\u6700\u7b80\u6d01\u7684\u65b9\u5f0f\u5411\u4f60\u4ecb\u7ecd\u6838\u5fc3\u77e5\u8bc6\uff0c\u800c\u4e0d\u4f1a\u8ba9\u4f60\u88ab\u7e41\u7410\u7684\u672f\u8bed\u6240\u6df9\u6ca1\u3002\n\n## \u5bfc\u5165\n\n```python\nfrom aiomysql import connect\nfrom asymysql import ORM, mc, mf\n```\n\n## \u521b\u5efaORM\n\n```python\nasync def mkconn():\n    return await connect(\n        host = 'localhost',\n        port = 3306,\n        user = 'root',\n        password = '123456789'\n    )\n\norm = await ORM(mkconn)  # \u8d26\u6237ORM\ndb = orm['\u6cc9\u5dde\u5e02']  # \u5e93ORM\nsheet = db['\u5e0c\u671b\u5c0f\u5b66']  # \u8868ORM\n```\n\n## \u65b0\u589e\u6570\u636e\n\n```python\nline1 = {'\u59d3\u540d': '\u5c0f\u4e00', '\u5e74\u9f84':11, '\u7b7e\u5230\u65e5\u671f':'2023-01-11'}\nline2 = {'\u59d3\u540d': '\u5c0f\u4e8c', '\u5e74\u9f84':12, '\u7b7e\u5230\u65e5\u671f':'2023-01-12'}\nline3 = {'\u59d3\u540d': '\u5c0f\u4e09', '\u5e74\u9f84':13, '\u7b7e\u5230\u65e5\u671f':'2023-01-13'}\nline4 = {'\u59d3\u540d': '\u5c0f\u56db', '\u5e74\u9f84':14, '\u7b7e\u5230\u65e5\u671f':'2023-01-14'}\nline5 = {'\u59d3\u540d': '\u5c0f\u4e94', '\u5e74\u9f84':15, '\u7b7e\u5230\u65e5\u671f':'2023-01-15'}\nline6 = {'\u59d3\u540d': '\u5c0f\u516d', '\u5e74\u9f84':16, '\u7b7e\u5230\u65e5\u671f':'2023-01-16'}\n\nr1 = await sheet.insert(line1)  # \u6dfb\u52a01\u6761\u6570\u636e\nr2 = await sheet.insert([ line2, line3, line4, line5, line6 ])  # \u6279\u91cf\u6dfb\u52a0\n```\n\n\u67e5\u770b\u5206\u914d\u5230\u7684\u4e3b\u952e\uff1a\n\n```python\nr1.lastrowid\nr2.lastrowid\n```\n\n## \u67e5\u8be2\u793a\u4f8b\n\n```python\nawait sheet[:]  # \u67e5\u8be2\u6240\u6709\u6570\u636e\n\nawait sheet[3]  # \u67e5\u8be2\u7b2c3\u6761\u6570\u636e\n\nawait sheet[mc.\u5e74\u9f84>13][mc.\u59d3\u540d=='\u5c0f\u4e94'][1]  # \u67e5\u8be2\u5e74\u9f84\u5927\u4e8e13\u3001\u4e14\u59d3\u540d\u53eb'\u5c0f\u4e94'\u7684\u7b2c1\u6761\u6570\u636e\n```\n\n\u6ce8\uff1a\u540e\u6587\u6709\u5173\u4e8e\u67e5\u8be2\u7684\u8be6\u7ec6\u6559\u7a0b\u3002\n\n## \u4fee\u6539\n\n### \u6279\u91cf\u4fee\u6539\n\n```python\ndata = {\n    '\u89c6\u529b': 5.0,\n    '\u6027\u522b': '\u7537',\n    '\u7231\u597d': '\u8db3\u7403,\u7bee\u7403,\u753b\u753b,\u8df3\u7ef3'\n}\n\nr = await sheet[mc.\u5e74\u9f84>11].update(data)[2:5]  # \u4fee\u6539\u7b26\u5408\u6761\u4ef6\u7684\u7b2c2~5\u6761\u6570\u636e\n\nr.rowcount  # \u67e5\u770b\u4fee\u6539\u8be6\u60c5\n```\n\n### \u6309\u4e3b\u952e\u4fee\u6539\n\n```python\ndata = {\n    2: {'\u59d3\u540d':'xiao\u4e8c', '\u5e74\u9f84':20},\n    3: {'\u5e74\u7ea7':'\u4e09\u5e74\u7ea7'},\n    4: {'id':400, '\u89c6\u529b':4.0}\n}\n\nawait sheet.update_by_pk(data)\n```\n\n### \u7528\u81ea\u5b9a\u4e49\u51fd\u6570\u4fee\u6539\n\n```python\ndef handler(row:dict):\n    row['\u5e74\u9f84'] += 1  # \u5e74\u9f84\u7edf\u4e00\u52a01\u5c81\n    if row['\u7231\u597d'] == '\u6253\u7bee\u7403':\n        row['\u8eab\u9ad8'] = 180\n    elif row['\u7231\u597d'] == '\u73a9\u624b\u673a':\n        row['\u89c6\u529b'] = 1.8\n    row['\u59d3\u540d'] = row['\u59d3\u540d'].replace('\u5c0f', 'xiao')\n\nawait sheet[mc.\u5e74\u9f84>11].apply(handler)[:]  # \u4fee\u6539\u7b26\u5408\u6761\u4ef6\u7684\u6240\u6709\u6570\u636e\nawait sheet[mc.\u5e74\u9f84>11].apply(handler)[2:-2]  # \u4fee\u6539\u7b26\u5408\u6761\u4ef6\u7684\u7b2c2\u6761~\u5012\u6570\u7b2c2\u6761\nawait sheet[mc.\u5e74\u9f84>11].apply(handler)[2]  # \u4fee\u6539\u7b26\u5408\u6761\u4ef6\u7684\u7b2c2\u6761\u6570\u636e\n```\n\n\u6ce8\uff1a\n\n1\u3001\u4f20\u9012\u7ed9 apply \u65b9\u6cd5\u7684\u51fd\u6570\u5fc5\u987b\u63a5\u6536\u4e14\u4ec5\u63a5\u65361\u4e2a\u53c2\u6570\uff0c\u53c2\u6570\u540d\u53ef\u4ee5\u4e0d\u662f\u2018row\u2019\u3002\n\n2\u3001\u53ef\u53ea\u63d0\u53d6\u9700\u8981\u7684\u5b57\u6bb5\u4ee5\u63d0\u5347\u6027\u80fd\u3002\u6bd4\u5982\u5728\u4e0a\u4f8b\u4e2d\uff0chandler \u51fd\u6570\u53ea\u4f7f\u7528\u5230\u5e74\u9f84\u3001\u7231\u597d\u3001\u59d3\u540d\u8fd93\u4e2a\u5b57\u6bb5\uff0c\u53ef\u6539\u4e3a `await sheet[mc.\u5e74\u9f84>11]['\u5e74\u9f84', '\u7231\u597d', '\u59d3\u540d'].apply(handler)[:]` \u4ee5\u63d0\u9ad8\u6027\u80fd\u3002\n\n3\u3001ORM \u4f1a\u81ea\u52a8\u5bf9\u6bd4\u4fee\u6539\u524d\u4e0e\u4fee\u6539\u540e\u7684\u6570\u636e\u5dee\u5f02\uff0c\u53ea\u63d0\u4ea4\u5dee\u5f02\u90e8\u5206\u5230\u6570\u636e\u5e93\u3002\n\n## \u5220\u9664\n\n```python\n# \u5220\u9664\u5e74\u9f84>=15\u7684\u6240\u6709\u6570\u636e\nr1 = await sheet[mc.\u5e74\u9f84>=15].delete()[:]\n\n# \u5220\u9664\u5e74\u9f84\u5927\u4e8e10\u3001\u4e14\u559c\u6b22\u8db3\u7403\u7684\u7b2c2\u6761\u6570\u636e\nr2 = await sheet[mc.\u5e74\u9f84>10][mc.\u7231\u597d.re('\u8db3\u7403')].delete()[2]\n\n# \u5220\u9664\u6240\u6709\u6570\u636e\nr3 = await sheet.delete()[:]\n\n# \u67e5\u770b\u5220\u9664\u8be6\u60c5\nr1.rowcount\nr2.rowcount\nr3.rowcount\n```\n\n## \u5207\u7247\n\n1\u3001\u5207\u7247\u683c\u5f0f\u4e3a  [start: stop: step]  \uff0cstart \u8868\u793a\u4ece\u54ea\u6761\u5f00\u59cb\uff0cstop \u8868\u793a\u5230\u54ea\u6761\u505c\u6b62\uff0cstep \u8868\u793a\u6b65\u957f\u3002\n\n2\u3001start \u548c stop\n\n* \u5f53\u4e3a\u6b63\u503c\u65f6\uff0c\u8868\u793a\u6b63\u5e8f\u7b2c x \u6761\uff0c\u4f8b\u5982\uff1a1 \u8868\u793a\u7b2c 1 \u6761\u30012 \u8868\u793a\u7b2c 2 \u6761\u3002\n* \u5f53\u4e3a\u8d1f\u503c\u65f6\uff0c\u8868\u793a\u5012\u6570\u7b2c x \u6761\uff0c\u4f8b\u5982\uff1a-1 \u8868\u793a\u5012\u6570\u7b2c 1 \u6761\u3001-2 \u8868\u793a\u5012\u6570\u7b2c 2 \u6761\u3002\n* \u4e0d\u53ef\u4e3a 0 \u3002\n\n3\u3001step\n\n* \u987b\u4e3a\u6b63\u6574\u6570\u3002\n* \u5f53 step >= 2  \u65f6\u8868\u793a\u95f4\u9694\u5f0f\u5207\u7247\u3002\n* \u5f53 step = 1 \u65f6\u53ef\u7701\u7565 `: step` \uff0c\u5373\uff1a[start: stop] \u7b49\u4ef7\u4e8e [start: stop: 1] \u3002\n\n4\u3001\u4e0e Python \u5207\u7247\u98ce\u683c\u5bf9\u6bd4\n\n\u6b64 ORM \u7684\u5207\u7247\u98ce\u683c\u6bd4 Python \u5207\u7247\u98ce\u683c\u66f4\u4eba\u6027\u5316\u3002\u5177\u4f53\u533a\u522b\u4e3a\uff1a\n\n|                                        | **Python**                                            | **asymysql**                                         |\n| -------------------------------------- | ----------------------------------------------------------- | ----------------------------------------------------------- |\n| **\u7d22\u5f15**                         | \u4ece 0 \u5f00\u59cb\uff0c\u4f8b\u5982\uff1a<br />[0] \u8868\u793a\u7b2c 1 \u4e2a\u5143\u7d20\u3001[1] \u8868\u793a\u7b2c 2 \u4e2a\u5143\u7d20 | \u4ece 1 \u5f00\u59cb\uff0c\u4f8b\u5982\uff1a<br />[1] \u8868\u793a\u7b2c 1 \u4e2a\u5143\u7d20\u3001[2] \u8868\u793a\u7b2c 2 \u4e2a\u5143\u7d20 |\n| **\u5207\u7247**                         | \u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff0c\u4f8b\u5982\uff1a<br />[3: 5] \u8868\u793a\u7b2c 4~5 \u8fd9 2 \u4e2a\u5143\u7d20     | \u53cc\u95ed\u533a\u95f4\uff0c\u4f8b\u5982\uff1a<br />[3: 5] \u8868\u793a\u7b2c 3~5 \u8fd9 3 \u4e2a\u5143\u7d20         |\n| **\u4ece\u53f3\u5f80**<br />**\u5de6\u5207\u7247** | step\u00a0\u4e3a\u8d1f\u503c\uff0c\u4f8b\u5982\uff1a<br />[9: 1: -1] \u8868\u793a\u7b2c 9~3 \u8fd9 7 \u4e2a\u5143\u7d20 | step \u4e3a\u6b63\u503c\uff0c\u4f8b\u5982\uff1a<br />[9: 1: 1] \u8868\u793a\u7b2c 9~1 \u8fd9 9 \u4e2a\u5143\u7d20   |\n\n### \u793a\u4f8b\n\n```python\nawait sheet[\u8fc7\u6ee4\u5668]...[\u8fc7\u6ee4\u5668][:]  # \u67e5\u8be2\u7b26\u5408\u6761\u4ef6\u7684\u5168\u90e8\u6570\u636e\nawait sheet[\u8fc7\u6ee4\u5668]...[\u8fc7\u6ee4\u5668][:] = None  # \u5220\u9664\u7b26\u5408\u6761\u4ef6\u7684\u5168\u90e8\u6570\u636e\nawait sheet[\u8fc7\u6ee4\u5668]...[\u8fc7\u6ee4\u5668][:] = {'\u5e74\u7ea7':'\u521d\u4e00'}  # \u4fee\u6539\u7b26\u5408\u6761\u4ef6\u7684\u5168\u90e8\u6570\u636e\n\nawait sheet[\u8fc7\u6ee4\u5668]...[\u8fc7\u6ee4\u5668][1]  # \u67e5\u8be2\u7b26\u5408\u6761\u4ef6\u7684\u7b2c1\u6761\nawait sheet[\u8fc7\u6ee4\u5668]...[\u8fc7\u6ee4\u5668][1] = None  # \u5220\u9664\u7b26\u5408\u6761\u4ef6\u7684\u7b2c1\u6761\nawait sheet[\u8fc7\u6ee4\u5668]...[\u8fc7\u6ee4\u5668][1] = {'\u5e74\u7ea7':'\u521d\u4e00'}  # \u4fee\u6539\u7b26\u5408\u6761\u4ef6\u7684\u7b2c1\u6761\n\nawait sheet[\u8fc7\u6ee4\u5668]...[\u8fc7\u6ee4\u5668][3:7]  # \u67e5\u8be2\u7b26\u5408\u6761\u4ef6\u7684\u7b2c3~7\u6761\nawait sheet[\u8fc7\u6ee4\u5668]...[\u8fc7\u6ee4\u5668][3:7] = None  # \u5220\u9664\u7b26\u5408\u6761\u4ef6\u7684\u7b2c3~7\u6761\nawait sheet[\u8fc7\u6ee4\u5668]...[\u8fc7\u6ee4\u5668][3:7] = {'\u5e74\u7ea7':'\u521d\u4e00'}  # \u4fee\u6539\u7b26\u5408\u6761\u4ef6\u7684\u7b2c3~7\u6761\n\nawait sheet[\u8fc7\u6ee4\u5668]...[\u8fc7\u6ee4\u5668][3:7:2]  # \u67e5\u8be2\u7b26\u5408\u6761\u4ef6\u7684\u7b2c3\u30015\u30017\u6761\nawait sheet[\u8fc7\u6ee4\u5668]...[\u8fc7\u6ee4\u5668][3:7:2] = None  # \u5220\u9664\u7b26\u5408\u6761\u4ef6\u7684\u7b2c3\u30015\u30017\u6761\nawait sheet[\u8fc7\u6ee4\u5668]...[\u8fc7\u6ee4\u5668][3:7:2] = {'\u5e74\u7ea7':'\u521d\u4e00'}  # \u4fee\u6539\u7b26\u5408\u6761\u4ef6\u7684\u7b2c3\u30015\u30017\u6761\n```\n\n\u503c\u5f97\u6ce8\u610f\u7684\u5730\u65b9\uff1a  [3: 8: 2]  \u64cd\u4f5c\u7b2c  3\u30015\u30017  \u6761\uff0c\u800c  [8: 3: 2]  \u64cd\u4f5c\u7b2c  8\u30016\u30014  \u6761\u3002\n\n\u66f4\u591a\u793a\u4f8b\uff1a\n\n```python\n[:]           # \u6240\u6709\u6570\u636e\n[1:-1]        # \u6240\u6709\u6570\u636e\n[-1:1]        # \u6240\u6709\u6570\u636e\uff08\u9006\u5e8f\uff09\n[1:]          # \u6240\u6709\u6570\u636e\n[:1000]       # \u7b2c1\u6761 ~ \u7b2c1000\u6761\n[:-1000]      # \u7b2c1\u6761 ~ \u5012\u6570\u7b2c1000\u6761\n[100:200]     # \u7b2c100\u6761 ~ \u7b2c200\u6761\n[200:100]     # \u7b2c200\u6761 ~ \u7b2c100\u6761\n[-300:-2]     # \u5012\u6570\u7b2c300\u6761 ~ \u5012\u6570\u7b2c2\u6761\n[50:-2]       # \u7b2c50\u6761 ~ \u5012\u6570\u7b2c2\u6761\n[250:]        # \u7b2c250\u6761 ~ \u6700\u540e1\u6761\n[-250:]       # \u5012\u6570\u7b2c250\u6761 ~ \u6700\u540e1\u6761\n[1]           # \u7b2c1\u6761\n[-1]          # \u6700\u540e1\u6761\n[::3]         # \u4ee53\u4e3a\u95f4\u8ddd, \u95f4\u9694\u64cd\u4f5c\u6240\u6709\u6570\u636e\n[100:200:4]   # \u4ee54\u4e3a\u95f4\u8ddd, \u95f4\u9694\u64cd\u4f5c\u7b2c100\u6761 ~ \u7b2c200\u6761\n```\n\n## \u8fc7\u6ee4\u5668\n\n\u8fc7\u6ee4\u5668\u7684\u7ed3\u6784\u4e3a `mc.<\u5b57\u6bb5\u540d\u79f0><\u8fd0\u7b97\u7b26><\u503c>` \uff0c\u4f8b\u5982 `mc.\u5e74\u9f84 > 18` \u3002\n\n### \u6bd4\u8f83\u8fd0\u7b97\n\n| **\u4ee3\u7801** |\n| -------------- |\n| mc.\u5e74\u9f84 > 10   |\n| mc.\u5e74\u9f84 >= 10  |\n| mc.\u5e74\u9f84 < 10   |\n| mc.\u5e74\u9f84 <= 10  |\n| mc.\u5e74\u9f84 == 10  |\n| mc.\u5e74\u9f84 != 10  |\n\n### \u6210\u5458\u8fd0\u7b97\n\n| **\u4ee3\u7801**               | **\u89e3\u91ca**                   |\n| ---------------------------- | -------------------------------- |\n| mc.\u5e74\u7ea7.isin('\u521d\u4e09', '\u9ad8\u4e8c') | \u82e5\u5b57\u6bb5\u503c\u662f\u4f20\u5165\u503c\u7684\u6210\u5458\uff0c\u5219\u7b26\u5408   |\n| mc.\u5e74\u9f84.notin(10, 30, 45)    | \u82e5\u5b57\u6bb5\u503c\u4e0d\u662f\u4f20\u5165\u503c\u7684\u6210\u5458\uff0c\u5219\u7b26\u5408 |\n\n\u6ce8\uff1a\n\n1\u3001isin\u3001notin \u7684\u4f20\u5165\u503c\u90fd\u4e0d\u5fc5\u662f\u540c\u7c7b\u578b\u7684\u6570\u636e\uff0c\u4ee5isin\u4e3a\u4f8b\uff1a\u53ef\u4ee5\u8fd9\u6837\u4f7f\u7528\uff1a  mc.tag.isin(3, 3.5, '\u5b66\u751f', None)  \uff0c\u4f20\u5165\u503c\u542b\u6709int\u578b\u3001float\u578b\u3001str\u578b\u3001None\u3002\n\n2\u3001\u6210\u5458\u8fd0\u7b97\u7b26\u672a\u4f20\u5165\u4efb\u4f55\u503c\u65f6\u7684\u5904\u7406\u65b9\u5f0f\uff1a\n\n| **\u4ee3\u7801**   | **\u5904\u7406\u65b9\u5f0f** |\n| ---------------- | ------------------ |\n| mc.\u5e74\u7ea7.isin( )  | \u6240\u6709\u6570\u636e\u90fd \u4e0d\u7b26\u5408  |\n| mc.\u5e74\u7ea7.notin( ) | \u6240\u6709\u6570\u636e\u90fd \u7b26\u5408    |\n\n### \u6b63\u5219\u8fd0\u7b97\n\n| **\u4ee3\u7801**   |\n| ---------------- |\n| mc.\u59d3\u540d.re('\u5c0f') |\n\n### \u8fc7\u6ee4\u5668\u7684\u96c6\u5408\u8fd0\u7b97\n\n| **\u4ee3\u7801**                                                       | **\u89e3\u91ca** |\n| -------------------------------------------------------------------- | -------------- |\n| [ mc.\u5e74\u9f84>3 ][ mc.\u5e74\u9f84<100 ]                                         | \u4ea4\u96c6           |\n| [ (mc.\u5e74\u9f84<30)\\| (mc.\u5e74\u9f84>30) \\| (mc.\u5e74\u9f84==30)\u00a0\\| (mc.\u5e74\u9f84==None) ] | \u5e76\u96c6           |\n| [ (mc.\u5e74\u9f84>3) - (mc.\u5e74\u9f84>100) ]                                      | \u5dee\u96c6           |\n| [ ~(mc.\u5e74\u9f84>100) ]                                                   | \u8865\u96c6           |\n\n\u6ce8\uff1a\u56db\u79cd\u96c6\u5408\u8fd0\u7b97\u53ef\u4ee5\u76f8\u4e92\u5d4c\u5957\uff0c\u4e14\u53ef\u4ee5\u65e0\u9650\u5d4c\u5957\u3002\n\n### \u7279\u6b8a\u5b57\u6bb5\u540d\u7684\u8868\u793a\u65b9\u6cd5\n\nMySQL\u652f\u6301\u5404\u79cd\u7279\u6b8a\u7684\u5b57\u6bb5\u540d\uff0c\u5982\uff1a\u6570\u5b57\u3001\u7b26\u53f7\u3001emoji\u8868\u60c5\uff0c\u8fd9\u4e9b\u5b57\u7b26\u5728Python\u4e2d\u4e0d\u662f\u5408\u6cd5\u53d8\u91cf\u540d\uff0c\u4f7f\u7528  mc.1\u3001mc.+  \u7b49\u683c\u5f0f\u4f1a\u62a5\u9519\uff0c\u53ef\u7528  mc['1']\u3001mc['+']  \u8fd9\u79cd\u683c\u5f0f\u4ee3\u66ff\u3002\n\n### \u5b57\u6bb5\u63d0\u793a\n\n\u53d8\u91cf mc \u65e0\u5b57\u6bb5\u63d0\u793a\u529f\u80fd\uff0c\u8f93\u5165\u2018mc.\u2019\u540e\uff0c\u7f16\u8f91\u5668\u4e0d\u4f1a\u63d0\u793a\u53ef\u9009\u5b57\u6bb5\u3002\u540e\u6587\u6709\u5173\u4e8e\u5982\u4f55\u8bbe\u7f6e\u5b57\u6bb5\u63d0\u793a\u7684\u5185\u5bb9\u3002\n\n## \u67e5\u8be2\n\n### \u9650\u5b9a\u8fd4\u56de\u5b57\u6bb5\n\n\u53ea\u8fd4\u56de\u59d3\u540d\u3001\u5e74\u9f84\u8fd92\u4e2a\u5b57\u6bb5\uff1a\n\n```python\nawait sheet[mc.\u5e74\u7ea7=='\u9ad8\u4e00']['\u59d3\u540d','\u5e74\u9f84'][:]\n```\n\n\u6ce8\uff1a\n\n1\u3001\u5b57\u6bb5\u9650\u5b9a\u5668\u53ef\u653e\u5728sheet\u4e0e[:]\u4e4b\u95f4\u7684\u4efb\u610f\u4f4d\u7f6e\u3002\u4ee5\u4e0b3\u884c\u4ee3\u7801\u7684\u8fd4\u56de\u7ed3\u679c\u76f8\u540c\uff1a\n\n```python\nawait sheet[mc.\u5e74\u9f84>11][mc.\u5e74\u9f84<30]['\u59d3\u540d', '\u5e74\u9f84'][:]\nawait sheet[mc.\u5e74\u9f84>11]['\u59d3\u540d', '\u5e74\u9f84'][mc.\u5e74\u9f84<30][:]\nawait sheet['\u59d3\u540d', '\u5e74\u9f84'][mc.\u5e74\u9f84>11][mc.\u5e74\u9f84<30][:]\n```\n\n2\u3001\u53ef\u53cd\u590d\u9650\u5b9a\u5b57\u6bb5\uff0c\u67e5\u8be2\u65f6\u662f\u6839\u636e\u6700\u540e1\u6b21\u6307\u5b9a\u7684\u5b57\u6bb5\u63d0\u53d6\u6570\u636e\u3002\u4ee5\u4e0b\u4ee3\u7801\u8fd4\u56de\u7ed3\u679c\u4e2d\u53ea\u6709\u2018\u5e74\u9f84\u2019\u5b57\u6bb5\uff1a\n\n```python\nawait sheet[mc.\u5e74\u7ea7=='\u9ad8\u4e00']['\u59d3\u540d']['\u5e74\u9f84'][:]\n```\n\n3\u3001\u82e5\u60f3\u6062\u590d\u63d0\u53d6\u5168\u90e8\u5b57\u6bb5\uff0c\u5219\u9650\u5b9a\u5b57\u6bb5\u4e3a '\\*'  \uff0c'\\*'\u5373\u4ee3\u8868\u201c\u5168\u90e8\u5b57\u6bb5\u201d\u3002\n\n```python\nawait sheet[mc.\u5e74\u7ea7=='\u9ad8\u4e00']['\u59d3\u540d']['*'][:]\n```\n\n\uff08\u4e3a\u4ec0\u4e48\u6709\u65f6\u5019\u8981\u5148\u9650\u5b9a\u5b57\u6bb5\uff0c\u7136\u540e\u518d\u53d6\u6d88\u9650\u5b9a\uff0c\u800c\u4e0d\u662f\u4e00\u5f00\u59cb\u5c31\u4e0d\u9650\u5b9a\u5b57\u6bb5\uff1f\u8fd9\u662f\u56e0\u4e3a\u5728\u67d0\u4e9b\u573a\u666f\u4e2d\u8fd9\u6837\u505a\u53ef\u4ee5\u4f7f\u4ee3\u7801\u6574\u4f53\u4e0a\u66f4\u4f18\u96c5\u3002\u53c2\u89c1\u540e\u6587 [ \u5982\u4f55\u5199\u51fa\u4f18\u96c5\u7684\u4ee3\u7801 ](#\u5982\u4f55\u5199\u51fa\u4f18\u96c5\u7684\u4ee3\u7801) \uff09\n\n### 1\u4e2a\u590d\u6742\u7684\u67e5\u8be2\u793a\u4f8b\n\n```python\n_ = sheet\n_ = _[mc.\u5e74\u9f84>=12]  # \u6bd4\u8f83\n_ = _[mc.\u59d3\u540d.isin('\u5c0f\u4e09','\u5c0f\u56db')]  # \u88ab\u5305\u542b\n_ = _[mc.\u59d3\u540d.notin('\u5341\u4e09','\u5341\u56db')]  # \u4e0d\u88ab\u5305\u542b\n_ = _[(mc.\u5e74\u9f84==15) | (mc.\u5e74\u9f84>15) | (mc.\u5e74\u9f84<15)]  # \u5e76\u96c6\n_ = _[mc.\u5e74\u9f84>=3][mc.\u5e74\u9f84<100]  # \u4ea4\u96c6\n_ = _[(mc.\u5e74\u9f84>=3) - (mc.\u5e74\u9f84>100)]  # \u5dee\u96c6\n_ = _[~ (mc.\u5e74\u9f84>100)]  # \u8865\u96c6\n_ = _[mc.\u59d3\u540d.re('\u5c0f')]  # \u6b63\u5219\u8868\u8fbe\u5f0f\nawait _[:]  # \u5207\u7247\n```\n\n\u6ce8\uff1a\u65e0\u8bba\u8fc7\u6ee4\u5668\u591a\u590d\u6742\uff0cORM\u90fd\u4e0d\u4f1a\u8bbf\u95ee\u6570\u636e\u5e93\uff0c\u53ea\u6709\u5728\u6700\u540e\u5207\u7247\u65f6\uff0cORM\u624d\u4f1a\u8bbf\u95ee\u6570\u636e\u5e93\u3002\n\n## \u6392\u5e8f\n\n\u5bf9\u6240\u6709\u5e74\u7ea7\u4e3a\u201c\u9ad8\u4e00\u201d\u7684\u6570\u636e\uff0c\u4f18\u5148\u6309\u5e74\u9f84\u964d\u5e8f\uff0c\u5176\u6b21\u6309\u59d3\u540d\u5347\u5e8f\uff0c\u6392\u5e8f\u540e\u8fd4\u56de\u7b2c2\\~4\u6761\u6570\u636e\uff1a\n\n```python\nawait sheet[mc.\u5e74\u7ea7=='\u9ad8\u4e00'].order(\u5e74\u9f84=False, \u59d3\u540d=True)[2:4]\n```\n\n\u6709\u8da3\u7684\uff0c\u4ee5\u4e0b\u4e24\u884c\u4ee3\u7801\u7684\u8fd4\u56de\u7ed3\u679c\u76f8\u540c\uff1a\n\n```python\nawait sheet[mc.\u5e74\u7ea7=='\u9ad8\u4e00'].order(\u5e74\u9f84=True)[1:-1]\n\nawait sheet[mc.\u5e74\u7ea7=='\u9ad8\u4e00'].order(\u5e74\u9f84=False)[-1:1]\n```\n\n\u89e3\u91ca\uff1aorder(\u5e74\u9f84=False)\u8868\u793a\u6309\u5e74\u9f84\u964d\u5e8f\uff0c[-1:1]\u8868\u793a\u9006\u5e8f\u5207\u7247\uff0c\u4ea7\u751f\u4e86\u7c7b\u4f3c\u2018\u8d1f\u8d1f\u5f97\u6b63\u2019\u7684\u6548\u679c\u3002\n\n\u6ce8\uff1a\n\n1\u3001\u6392\u5e8f\u5668\u53ef\u653e\u5728sheet\u4e0e[:]\u4e4b\u95f4\u7684\u4efb\u610f\u4f4d\u7f6e\u3002\u4ee5\u4e0b3\u884c\u4ee3\u7801\u7684\u8fd4\u56de\u7ed3\u679c\u76f8\u540c\uff1a\n\n```python\nawait sheet[mc.\u5e74\u7ea7=='\u9ad8\u4e00'][mc.\u89c6\u529b>4.8].order(\u5e74\u9f84=False)[2:4]\nawait sheet[mc.\u5e74\u7ea7=='\u9ad8\u4e00'].order(\u5e74\u9f84=False)[mc.\u89c6\u529b>4.8][2:4]\nawait sheet.order(\u5e74\u9f84=False)[mc.\u5e74\u7ea7=='\u9ad8\u4e00'][mc.\u89c6\u529b>4.8][2:4]\n```\n\n2\u3001\u53ef\u53cd\u590d\u6392\u5e8f\uff0c\u67e5\u8be2\\|\u4fee\u6539\\|\u5220\u9664 \u65f6\u662f\u6839\u636e\u6700\u540e1\u6b21\u6307\u5b9a\u7684\u987a\u5e8f\u63d0\u53d6\u6570\u636e\u3002\u4ee5\u4e0b\u4ee3\u7801\u6700\u7ec8\u662f\u6309\u5e74\u9f84\u964d\u5e8f\u540e\u63d0\u53d6\u6570\u636e\uff1a\n\n```python\nawait sheet.order(\u5e74\u9f84=True, \u59d3\u540d=False).order(\u5e74\u9f84=False)[:]\n```\n\n3\u3001\u82e5\u60f3\u53d6\u6d88\u6392\u5e8f\uff0c\u5219\u518d\u6b21\u8c03\u7528order\u65b9\u6cd5\uff0c\u4f46\u4e0d\u4f20\u5165\u4efb\u4f55\u503c\u3002\n\n```python\nawait sheet.order(\u5e74\u9f84=True, \u59d3\u540d=False).order()[:]\n```\n\n\uff08\u4e3a\u4ec0\u4e48\u6709\u65f6\u5019\u8981\u5148\u6392\u5e8f\uff0c\u7136\u540e\u518d\u53d6\u6d88\u6392\u5e8f\uff0c\u800c\u4e0d\u662f\u4e00\u5f00\u59cb\u5c31\u4e0d\u6392\u5e8f\uff1f\u8fd9\u662f\u56e0\u4e3a\u5728\u67d0\u4e9b\u573a\u666f\u4e2d\u8fd9\u6837\u505a\u53ef\u4ee5\u4f7f\u4ee3\u7801\u6574\u4f53\u4e0a\u66f4\u4f18\u96c5\u3002\u53c2\u89c1\u540e\u6587 [ \u5982\u4f55\u5199\u51fa\u4f18\u96c5\u7684\u4ee3\u7801 ](#\u5982\u4f55\u5199\u51fa\u4f18\u96c5\u7684\u4ee3\u7801) \uff09\n\n## \u7edf\u8ba1\n\n| **\u9879\u76ee**  | **\u8bed\u6cd5**                 | **\u8fd4\u56de**                                          |\n| --------------- | ------------------------------ | ------------------------------------------------------- |\n| \u4e3b\u952e            | await sheet.get_pk( )           | 'id'                                                    |\n| \u6240\u6709\u5b57\u6bb5        | await sheet.get_columns( )      | [{'name':'id', 'comment':'', 'type':'int'}, {...}, ...] |\n| \u6570\u636e\u603b\u91cf        | await sheet.len( )             | 0                                                       |\n| \u5e74\u9f84>10\u7684\u6570\u636e\u91cf | await sheet[mc.\u5e74\u9f84>10].len( ) | 0                                                       |\n\n## orm\uff08\u8d26\u6237ORM\uff09\n\n| **\u529f\u80fd**   | **\u8bed\u6cd5**          | **\u8fd4\u56de**                                                         |\n| ---------------- | ----------------------- | ---------------------------------------------------------------------- |\n| \u83b7\u53d6\u6240\u6709\u5e93\u7684\u540d\u79f0 | await orm.get_db_names( ) | ['information_schema', 'mysql', 'performance_schema', 'sys', '\u6cc9\u5dde\u5e02'] |\n| \u7edf\u8ba1\u5e93\u7684\u6570\u91cf     | await orm.len( )        | 5                                                                      |\n\n## db\uff08\u5e93ORM\uff09\n\n| **\u529f\u80fd**   | **\u8bed\u6cd5**            | **\u8fd4\u56de** |\n| ---------------- | ------------------------- | -------------- |\n| \u83b7\u53d6\u6240\u6709\u8868\u7684\u540d\u79f0 | await db.get_sheet_names( ) | ['\u5e0c\u671b\u5c0f\u5b66']   |\n| \u7edf\u8ba1\u8868\u7684\u6570\u91cf     | await db.len( )           | 1              |\n\n## \u8c03\u7528mysql\u51fd\u6570\n\n\u8c03\u7528mysql\u51fd\u6570\u7684\u8bed\u6cd5\u4e3a `mf.<\u51fd\u6570\u540d\u79f0>(<\u53c2\u6570>)<\u8fd0\u7b97\u7b26><\u503c>` \u3002\n\n```python\n# \u5728\u67e5\u8be2\u3001\u5220\u9664\u3001\u4fee\u6539\u7684\u6761\u4ef6\u4e2d\u4f7f\u7528\nawait sheet[mf.year('\u7b7e\u5230\u65e5\u671f') == 2023][:]\nawait sheet[mf.year('\u7b7e\u5230\u65e5\u671f') == 2029].delete()[:]\nawait sheet[mf.year('\u7b7e\u5230\u65e5\u671f') == 2023].update({'\u6027\u522b':'\u5973'})[:]\n\n# \u5728\u4fee\u6539\u4e2d\u4f5c\u4e3a\u65b0\u503c\nawait sheet.update({'\u5907\u6ce8': '\u7b7e\u5230\u65e5\u671f'})[:]  # \u4fee\u6539\u4e3a'\u7b7e\u5230\u65e5\u671f'\u8fd9\u4e2a\u5b57\u7b26\u4e32\nawait sheet.update({'\u5907\u6ce8': mc.\u7b7e\u5230\u65e5\u671f})[:]  # \u4fee\u6539\u4e3a\u5404\u81ea\u7684'\u7b7e\u5230\u65e5\u671f'\u5b57\u6bb5\u7684\u503c\nawait sheet.update({'\u5907\u6ce8': mf.year('\u7b7e\u5230\u65e5\u671f')})[:]  # \u4fee\u6539\u4e3a\u5404\u81ea\u7684'\u7b7e\u5230\u65e5\u671f'\u5b57\u6bb5\u7684\u503c\u7ecfyear\u5904\u7406\u540e\u7684\u503c\n```\n\n\u4f7f\u7528\u8be5\u8bed\u6cd5\u53ef\u8c03\u7528mysql\u7684\u4efb\u610f\u51fd\u6570\u3002\n\nORM\u5df2\u6dfb\u52a0\u4e86\uff0820\u51e0\u4e2a\uff09mysql\u5e38\u7528\u51fd\u6570\u7684\u51fd\u6570\u540d\u63d0\u793a\uff0c\u8f93\u5165\u2018mf.\u2019\u540e\uff0c\u7f16\u8f91\u5668\u4f1a\u63d0\u793a\u53ef\u9009\u51fd\u6570\u540d\u3002\u5982\u6709\u9700\u8981\uff0c\u53ef\u6dfb\u52a0\u66f4\u591a\u63d0\u793a\uff0c\u53c2\u89c1\u540e\u6587 [ mysql\u51fd\u6570\u540d\u63d0\u793a ](#mysql\u51fd\u6570\u540d\u63d0\u793a) \u3002\uff08\u4e0d\u6dfb\u52a0\u63d0\u793a\u4e5f\u4e0d\u4f1a\u5f71\u54cd\u8c03\u7528\u3002\uff09\n\n## \u6267\u884c\u539f\u751fSQL\u8bed\u53e5\n\n```python\ndata, cursor = await sheet.execute('select \u59d3\u540d from \u5e0c\u671b\u5c0f\u5b66 limit 1')\ndata\n# >>> [{'\u59d3\u540d': '\u5c0f\u4e00'}]\n\ndata, cursor = await sheet.execute('update \u5e0c\u671b\u5c0f\u5b66 set \u7231\u597d=\"\u7f16\u7a0b\" limit 3')\ncursor.rowcount\n# >>> 3\n\ndata, cursor = await sheet.execute(\"delete from \u5e0c\u671b\u5c0f\u5b66 limit 2\")\ncursor.rowcount\n# >>> 2\n\nsql = 'insert into \u5e0c\u671b\u5c0f\u5b66(\u59d3\u540d, \u5e74\u9f84) values (%s, %s)'\nstudents = [('\u5c0f\u4e03', 17), ('\u5c0f\u516b', 18)]\ndata, cursor = await sheet.executemany(sql, students)\ncursor.lastrowid\n# >>> 8\n```\n\n## \u5173\u95edmysql\u8fde\u63a5\n\n\u5bf9 orm\u3001db\u3001sheet \u4e2d\u7684\u4efb\u610f\u4e00\u4e2a\u8c03\u7528 close( ) \u65b9\u6cd5\u5373\u53ef\u3002\n\n```python\nawait orm.close()\n\n# \u6216\u8005\uff1a\nawait db.close()\n\n# \u6216\u8005:\nawait sheet.close()\n```\n\n\u6ce8\uff1a\n\n1\u3001\u5173\u95ed mysql \u8fde\u63a5\u540e\uff0corm\u3001db\u3001sheet \u90fd\u53ef\u4ee5\u518d\u4f7f\u7528\u3002\u5f53\u518d\u6b21\u4f7f\u7528\u65f6\uff0cORM \u4f1a\u8c03\u7528 mkconn \u65b9\u6cd5\u521b\u5efa\u4e00\u4e2a\u65b0\u8fde\u63a5\u3002\n\n2\u3001\u8c03\u7528 orm.close( )\u3001db.close( )\u3001sheet.close( )  \u4e2d\u7684 1 \u4e2a\u5373\u53ef\u3002\u82e5\u591a\u6b21\u8c03\u7528\uff0cORM \u4f1a\u521b\u5efa\u4e00\u4e2a\u65b0\u8fde\u63a5\uff0c\u7136\u540e\u518d\u5173\u95ed\u8fd9\u4e2a\u65b0\u8fde\u63a5\u3002\n\n3\u3001\u82e5\u957f\u65f6\u95f4\u6ca1\u6709\u8c03\u7528 orm\u3001db\u3001sheet \u4e2d\u7684\u4efb\u610f\u4e00\u4e2a\uff0cmysql \u8fde\u63a5\u4e5f\u4f1a\u65ad\u5f00\uff0c\u8fd9\u662f mysql \u81ea\u8eab\u7684\u673a\u5236\u3002\u8fd9\u4e0d\u4f1a\u5f71\u54cd\u8fd9\u4e09\u8005\u7684\u540e\u7eed\u4f7f\u7528\uff0c\u5f53\u518d\u6b21\u8c03\u7528\u5b83\u4eec\u65f6\uff0cORM \u4f1a\u81ea\u52a8\u91cd\u65b0\u8fde\u63a5 mysql \u3002\n\n## \u4ee3\u7801\u63d0\u793a\n\n### \u5b57\u6bb5\u63d0\u793a\n\n\u53d8\u91cf mc \u65e0\u5b57\u6bb5\u63d0\u793a\u529f\u80fd\uff0c\u8f93\u5165\u2018mc.\u2019\u540e\uff0c\u7f16\u8f91\u5668\u4e0d\u4f1a\u63d0\u793a\u53ef\u9009\u5b57\u6bb5\u3002\n\n\u4e3a\u4e86\u83b7\u5f97\u5b57\u6bb5\u63d0\u793a\u529f\u80fd\uff0c\u53ef\u81ea\u5efa\u4e00\u4e2a\u2018mc2\u2019\uff1a\n\n```python\nclass mc2(mc):\n    \u59d3\u540d = \u5e74\u9f84 = \u7b7e\u5230\u65e5\u671f = \u5e74\u7ea7 = \u7231\u597d = None\n\nawait sheet[mc2.\u5e74\u9f84 > 10][:]\n```\n\n\u6ce8\uff1a\n\n1\u3001mc2 \u4e0e mc \u7528\u6cd5\u5b8c\u5168\u4e00\u81f4\uff0c\u53ef\u6df7\u7528\u3002\n\n2\u3001mc2 \u4e0e mc \u8bbe\u7f6e\u5b57\u6bb5\u63d0\u793a\u540e\uff0c\u4ec5\u5177\u5907\u63d0\u793a\u6548\u679c\uff0c\u800c\u4e0d\u4ea7\u751f\u4efb\u4f55\u5b9e\u9645\u7ea6\u675f\u3002\n\n### mysql\u51fd\u6570\u540d\u63d0\u793a\n\nORM\u5df2\u6dfb\u52a0\u4e86\uff0820\u51e0\u4e2a\uff09mysql\u5e38\u7528\u51fd\u6570\u7684\u51fd\u6570\u540d\u63d0\u793a\uff0c\u8f93\u5165\u2018mf.\u2019\u540e\uff0c\u7f16\u8f91\u5668\u4f1a\u63d0\u793a\u53ef\u9009\u51fd\u6570\u540d\u3002\u5982\u6709\u9700\u8981\uff0c\u53ef\u6dfb\u52a0\u66f4\u591a\u63d0\u793a\uff1a\n\n```python\nclass mf2(mf):\n    reverse = length = lower = upper = None\n\nawait sheet[mf2.reverse('\u59d3\u540d') == '\u4e8c\u5c0f'][:]\n```\n\n\u6ce8\uff1a\n\n1\u3001mf2 \u4e0e mf \u7528\u6cd5\u5b8c\u5168\u4e00\u81f4\uff0c\u53ef\u6df7\u7528\u3002\n\n2\u3001mf2 \u4e0e mf \u8bbe\u7f6e\u51fd\u6570\u540d\u63d0\u793a\u540e\uff0c\u4ec5\u5177\u5907\u63d0\u793a\u6548\u679c\uff0c\u800c\u4e0d\u4ea7\u751f\u4efb\u4f55\u5b9e\u9645\u7ea6\u675f\u3002\n\n## \u8868ORM\u7684\u72ec\u7acb\u6027\n\n### \u8868ORM\u7684\u72ec\u7acb\u6027\n\n\u5148\u770b\u4e00\u6761\u67e5\u8be2\u793a\u4f8b\uff1a\n\n```python\nawait sheet[mc.\u5e74\u9f84 > 5]['\u59d3\u540d','\u5e74\u9f84'][mc.\u59d3\u540d.re('\u5c0f')].order(id=False)[:]\n```\n\n\u4ee5\u4e0a\u793a\u4f8b\u4ee3\u7801\u53ef\u6539\u4e3a\u5982\u4e0b\uff08\u4e24\u8005\u6548\u679c\u76f8\u540c\uff09\uff1a\n\n```python\nd1 = sheet\nd2 = d1[mc.\u5e74\u9f84 > 5]\nd3 = d2['\u59d3\u540d','\u5e74\u9f84']\nd4 = d3[mc.\u59d3\u540d.re('\u5c0f')]\nd5 = d4.order(id=False)\nawait d5[:]\n```\n\n\u4ee5\u4e0a\u4ee3\u7801\u4e2d\uff0cd1\\~d5\u662f5\u4e2a\u4e0d\u540c\u7684\u8868ORM\uff0c\u5b83\u4eec\u5177\u6709\u72ec\u7acb\u7684\u6570\u636e\u7a7a\u95f4\uff08\u5b58\u653e\u7740\u8fc7\u6ee4\u6761\u4ef6\u3001\u5b57\u6bb5\u9650\u5b9a\u3001\u6392\u5e8f\u7b49\u4fe1\u606f\uff09\uff0c\u4e14\u4e92\u4e0d\u5e72\u6270\u3002d2\\~d5\u6bcf\u4e2a\u90fd\u62f7\u8d1d\u4e86\u524d\u4e00\u4e2aORM\u7684\u8868\u7a7a\u95f4\uff0c\u5e76\u589e\u52a0\u4e86\u81ea\u8eab\u7684\u65b0\u4fe1\u606f\u3002\n\n### \u5982\u4f55\u5199\u51fa\u4f18\u96c5\u7684\u4ee3\u7801\n\n\u5229\u7528\u8868ORM\u7684\u72ec\u7acb\u6027\uff0c\u53ef\u4ee5\u5728\u4e00\u4e9b\u590d\u6742\u7684\u573a\u666f\u4e2d\u5199\u51fa\u4f18\u96c5\u7b80\u6d01\u7684\u4ee3\u7801\u3002\n\n\u4e0d\u4f18\u96c5\u7684\u793a\u8303\uff1a\n\n```python\ndef GetName():\n    return requests.get('https://...').text\n\ndef output(datas):\n    ...\n\nwhile True:\n    datas = await sheet[\u8fc7\u6ee4\u56681][\u8fc7\u6ee4\u56682]...[\u8fc7\u6ee4\u56689][mc.name == GetName()][:]\n    output(datas)\n```\n\n\u4f18\u96c5\u7684\u793a\u8303\uff1a\n\n```python\ndef GetName():\n    return requests.get('https://...').text\n\ndef output(datas):\n    ...\n\nbaseSheet = sheet[\u8fc7\u6ee4\u56681][\u8fc7\u6ee4\u56682]...[\u8fc7\u6ee4\u56689]\nwhile True:\n    datas = await baseSheet[mc.name == GetName()][:]\n    output(datas)\n```\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "\u5f02\u6b65\u7684 mysql ORM",
    "version": "1.4.0.4",
    "project_urls": {
        "HomePage": "https://github.com/lcctoor/arts/tree/main/arts/asymysql"
    },
    "split_keywords": [
        "coolmysql",
        "asymysql",
        "pymysql",
        "mysql",
        "aiomysql",
        "orm"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "c6019c198976c637305286de1e94fa479c0e48bce1667fa9f20758122296fe82",
                "md5": "ded3515c76c42f062acaedd64c2f88c2",
                "sha256": "b7b6e7dbddb6a339a4913296a09d24b211a84634e58ad68c9de879d950e0ec42"
            },
            "downloads": -1,
            "filename": "asymysql-1.4.0.4-py2.py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "ded3515c76c42f062acaedd64c2f88c2",
            "packagetype": "bdist_wheel",
            "python_version": "py2.py3",
            "requires_python": null,
            "size": 11467,
            "upload_time": "2023-11-26T05:08:19",
            "upload_time_iso_8601": "2023-11-26T05:08:19.623364Z",
            "url": "https://files.pythonhosted.org/packages/c6/01/9c198976c637305286de1e94fa479c0e48bce1667fa9f20758122296fe82/asymysql-1.4.0.4-py2.py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "705c5ad98cdae40a7f4b9fd9835637d0b5caaad105184516090f4496b40ba970",
                "md5": "09204deff1725e984742286be532f3db",
                "sha256": "ec2548afcfcdca6861e2c272550180dcd6cfceed730bfa56c61002a9f4701aa8"
            },
            "downloads": -1,
            "filename": "asymysql-1.4.0.4.tar.gz",
            "has_sig": false,
            "md5_digest": "09204deff1725e984742286be532f3db",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 12681,
            "upload_time": "2023-11-26T05:08:23",
            "upload_time_iso_8601": "2023-11-26T05:08:23.389144Z",
            "url": "https://files.pythonhosted.org/packages/70/5c/5ad98cdae40a7f4b9fd9835637d0b5caaad105184516090f4496b40ba970/asymysql-1.4.0.4.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-11-26 05:08:23",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "lcctoor",
    "github_project": "arts",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "asymysql"
}
        
Elapsed time: 0.15112s