# Python MySQL 读写

使用 MySQL 实现一个 key-value(string:json) 读写库，请先完成【Python MySQL 安装说明】、【Python MySQL Connector】和【Python MySQL Connection】

```python
# -*- coding: UTF-8 -*-
import logging
import json
from error_code import ErrorCode
from mysql_connection import MySQLConnection
logger = logging.Logger(__name__)
mysql_connection_pool = None

class MySQLKeyValueStore(MySQLConnection):
    def __init__(self, host, port, user, password, database) -> None:
        super().__init__(host, port, user, password, database)

    def set(self, key, value):
        if self.conn is None:
            return {'err': ErrorCode.DB_OPEN_FAILED}

        try:
            value = json.dumps(value)
            sql = 'insert into key_value set _key=%s, value=%s on duplicate key update value=%s'
            args = (key, value, value)
            return self.execute(sql, args)
        except Exception as e:
            logger.error(f'set key:{key} exception:{str(e)}')
            return {"err": ErrorCode.DB_QUERY_EXCEPT}

    def get(self, key):
        # TODO(You): 请实现 get 方法


if __name__ == '__main__':
    kv = MySQLKeyValueStore(
        "127.0.0.1", 3306,
        "root", "WNpx8c\zr!fF",
        "test"
    )

    ret = kv.open()
    assert ret['err'] == ErrorCode.SUCCESS

    ret = kv.set('test', {"number": 0})
    assert ret['err'] == ErrorCode.SUCCESS

    ret = kv.get('test')
    print(ret)
    assert ret['err'] == ErrorCode.SUCCESS
    assert ret['value']['number'] == 0
    ret = kv.close()
    assert ret['err'] == ErrorCode.SUCCESS
```

请选出下列能**正确**实现这一功能的选项。

## template

```python
import logging
import json
from error_code import ErrorCode
from mysql_connection import MySQLConnection
logger = logging.Logger(__name__)
mysql_connection_pool = None


class MySQLKeyValueStore(MySQLConnection):
    def __init__(self, host, port, user, password, database) -> None:
        super().__init__(host, port, user, password, database)

    def set(self, key, value):
        if self.conn is None:
            return {'err': ErrorCode.DB_OPEN_FAILED}

        try:
            value = json.dumps(value)
            sql = 'insert into key_value set _key=%s, value=%s on duplicate key update value=%s'
            args = (key, value, value)
            return self.execute(sql, args)
        except Exception as e:
            logger.error(f'set key:{key} exception:{str(e)}')
            return {"err": ErrorCode.DB_QUERY_EXCEPT}

    def get(self, key):
        if self.conn is None:
            return {'err': ErrorCode.DB_NOT_OPEN}

        try:
            sql = 'select value from key_value where _key=%s'
            ret = self.execute(sql, (key,))
            if ret['err'] != ErrorCode.SUCCESS:
                return ret
            results = ret['results']
            if len(results) == 0:
                logger.warning(f'get key:{key}, empty.')
                return {"err": ErrorCode.NOT_FOUND}
            else:
                return {"err": ErrorCode.SUCCESS, "key": key, "value": json.loads(results[0])}
        except Exception as e:
            logger.error(f'get key:{key} exception:{str(e)}')
            return {"err": ErrorCode.DB_QUERY_EXCEPT}


if __name__ == '__main__':
    kv = MySQLKeyValueStore(
        "127.0.0.1", 3306,
        "root", "WNpx8c\zr!fF",
        "test"
    )

    ret = kv.open()
    assert ret['err'] == ErrorCode.SUCCESS

    ret = kv.set('test', {"number": 0})
    assert ret['err'] == ErrorCode.SUCCESS

    ret = kv.get('test')
    print(ret)
    assert ret['err'] == ErrorCode.SUCCESS
    assert ret['value']['number'] == 0
    ret = kv.close()
    assert ret['err'] == ErrorCode.SUCCESS
```

## 答案

```python
class MySQLKeyValueStore(MySQLConnection):
    ...
    def get(self, key):
        if self.conn is None:
            return {'err': ErrorCode.DB_NOT_OPEN}

        try:
            sql = 'select value from key_value where _key=%s'
            ret = self.execute(sql, (key,))
            if ret['err'] != ErrorCode.SUCCESS:
                return ret
            results = ret['results']
            if len(results) == 0:
                logger.warning(f'get key:{key}, empty.')
                return {"err": ErrorCode.NOT_FOUND}
            else:
                return {"err": ErrorCode.SUCCESS, "key": key, "value": json.loads(results[0])}
        except Exception as e:
            logger.error(f'get key:{key} exception:{str(e)}')
            return {"err": ErrorCode.DB_QUERY_EXCEPT}
```

## 选项

### A

```python
class MySQLKeyValueStore(MySQLConnection):
    ...
    def get(self, key):
        if self.conn is None:
            return {'err': ErrorCode.DB_NOT_OPEN}

        try:
            sql = 'select value from key_value where _key=%s'
            ret = self.execute(sql, (key,))

            results = ret['results']
            if len(results) == 0:
                logger.warning(f'get key:{key}, empty.')
                return {"err": ErrorCode.NOT_FOUND}
            else:
                return {"err": ErrorCode.SUCCESS, "key": key, "value": json.loads(results[0])}
        except Exception as e:
            logger.error(f'get key:{key} exception:{str(e)}')
            return {"err": ErrorCode.DB_QUERY_EXCEPT}
```

### B

```python
class MySQLKeyValueStore(MySQLConnection):
    ...
    def get(self, key):
        if self.conn is None:
            return {'err': ErrorCode.DB_NOT_OPEN}

        try:
            sql = 'select value from key_value where _key=%s'
            ret = self.execute(sql, (key,))
            if ret['err'] != ErrorCode.SUCCESS:
                return ret
            results = ret['results']
            return {"err": ErrorCode.SUCCESS, "key": key, "value": json.loads(results[0])}
        except Exception as e:
            logger.error(f'get key:{key} exception:{str(e)}')
            return {"err": ErrorCode.DB_QUERY_EXCEPT}
```

### C

```python
class MySQLKeyValueStore(MySQLConnection):
    ...
    def get(self, key):
        if self.conn is None:
            return {'err': ErrorCode.DB_NOT_OPEN}

        sql = 'select value from key_value where _key=%s'
        ret = self.execute(sql, (key,))
        if ret['err'] != ErrorCode.SUCCESS:
            return ret
        results = ret['results']
        if len(results) == 0:
            logger.warning(f'get key:{key}, empty.')
            return {"err": ErrorCode.NOT_FOUND}
        else:
            return {"err": ErrorCode.SUCCESS, "key": key, "value": json.loads(results[0])}
```

### D

```python
class MySQLKeyValueStore(MySQLConnection):
    ...
    def get(self, key):
        try:
            sql = 'select value from key_value where _key=%s'
            ret = self.execute(sql, (key,))
            if ret['err'] != ErrorCode.SUCCESS:
                return ret
            results = ret['results']
            if len(results) == 0:
                logger.warning(f'get key:{key}, empty.')
                return {"err": ErrorCode.NOT_FOUND}
            else:
                return {"err": ErrorCode.SUCCESS, "key": key, "value": json.loads(results[0])}
        except Exception as e:
            logger.error(f'get key:{key} exception:{str(e)}')
            return {"err": ErrorCode.DB_QUERY_EXCEPT}
```
