From d9ac8532dde7ebec59a2a4ec47e164d2ce6dee8e Mon Sep 17 00:00:00 2001 From: moling3650 <365024424@qq.com> Date: Thu, 19 May 2016 16:16:18 +0800 Subject: [PATCH 1/7] delete `create_args_string` function `', '.join('?' * len(mappings)` instand of `create_args_string` function --- www/orm.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/www/orm.py b/www/orm.py index 93ea5b4..b693902 100644 --- a/www/orm.py +++ b/www/orm.py @@ -56,12 +56,6 @@ async def execute(sql, args, autocommit=True): raise return affected -def create_args_string(num): - L = [] - for n in range(num): - L.append('?') - return ', '.join(L) - class Field(object): def __init__(self, name, column_type, primary_key, default): @@ -129,7 +123,7 @@ def __new__(cls, name, bases, attrs): attrs['__primary_key__'] = primaryKey # 主键属性名 attrs['__fields__'] = fields # 除主键外的属性名 attrs['__select__'] = 'select `%s`, %s from `%s`' % (primaryKey, ', '.join(escaped_fields), tableName) - attrs['__insert__'] = 'insert into `%s` (%s, `%s`) values (%s)' % (tableName, ', '.join(escaped_fields), primaryKey, create_args_string(len(escaped_fields) + 1)) + attrs['__insert__'] = 'insert into `%s` (%s, `%s`) values (%s)' % (tableName, ', '.join(escaped_fields), primaryKey, ', '.join('?' * len(mappings))) attrs['__update__'] = 'update `%s` set %s where `%s`=?' % (tableName, ', '.join(map(lambda f: '`%s`=?' % (mappings.get(f).name or f), fields)), primaryKey) attrs['__delete__'] = 'delete from `%s` where `%s`=?' % (tableName, primaryKey) return type.__new__(cls, name, bases, attrs) From fd965cf62fe110be748207d025c6b540348f2276 Mon Sep 17 00:00:00 2001 From: moling3650 <365024424@qq.com> Date: Thu, 19 May 2016 18:35:08 +0800 Subject: [PATCH 2/7] modify --- www/orm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/orm.py b/www/orm.py index b693902..b399009 100644 --- a/www/orm.py +++ b/www/orm.py @@ -123,7 +123,7 @@ def __new__(cls, name, bases, attrs): attrs['__primary_key__'] = primaryKey # 主键属性名 attrs['__fields__'] = fields # 除主键外的属性名 attrs['__select__'] = 'select `%s`, %s from `%s`' % (primaryKey, ', '.join(escaped_fields), tableName) - attrs['__insert__'] = 'insert into `%s` (%s, `%s`) values (%s)' % (tableName, ', '.join(escaped_fields), primaryKey, ', '.join('?' * len(mappings))) + attrs['__insert__'] = 'insert into `%s` (%s, `%s`) values (%s)' % (tableName, ', '.join(escaped_fields), primaryKey, ', '.join(['?'] * len(mappings))) attrs['__update__'] = 'update `%s` set %s where `%s`=?' % (tableName, ', '.join(map(lambda f: '`%s`=?' % (mappings.get(f).name or f), fields)), primaryKey) attrs['__delete__'] = 'delete from `%s` where `%s`=?' % (tableName, primaryKey) return type.__new__(cls, name, bases, attrs) From d2340de902b4ce5951de78465e65eecfc7d2c1c4 Mon Sep 17 00:00:00 2001 From: moling3650 <365024424@qq.com> Date: Fri, 20 May 2016 23:27:39 +0800 Subject: [PATCH 3/7] update orm.py --- www/orm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/orm.py b/www/orm.py index b399009..b693902 100644 --- a/www/orm.py +++ b/www/orm.py @@ -123,7 +123,7 @@ def __new__(cls, name, bases, attrs): attrs['__primary_key__'] = primaryKey # 主键属性名 attrs['__fields__'] = fields # 除主键外的属性名 attrs['__select__'] = 'select `%s`, %s from `%s`' % (primaryKey, ', '.join(escaped_fields), tableName) - attrs['__insert__'] = 'insert into `%s` (%s, `%s`) values (%s)' % (tableName, ', '.join(escaped_fields), primaryKey, ', '.join(['?'] * len(mappings))) + attrs['__insert__'] = 'insert into `%s` (%s, `%s`) values (%s)' % (tableName, ', '.join(escaped_fields), primaryKey, ', '.join('?' * len(mappings))) attrs['__update__'] = 'update `%s` set %s where `%s`=?' % (tableName, ', '.join(map(lambda f: '`%s`=?' % (mappings.get(f).name or f), fields)), primaryKey) attrs['__delete__'] = 'delete from `%s` where `%s`=?' % (tableName, primaryKey) return type.__new__(cls, name, bases, attrs) From 20755c40dc24247af63daca189dee33f87f39ad8 Mon Sep 17 00:00:00 2001 From: moling3650 <365024424@qq.com> Date: Fri, 20 May 2016 23:37:10 +0800 Subject: [PATCH 4/7] Simplify attrs['__select__']. this way is more clearly --- www/orm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/orm.py b/www/orm.py index b693902..6a375df 100644 --- a/www/orm.py +++ b/www/orm.py @@ -122,7 +122,7 @@ def __new__(cls, name, bases, attrs): attrs['__table__'] = tableName attrs['__primary_key__'] = primaryKey # 主键属性名 attrs['__fields__'] = fields # 除主键外的属性名 - attrs['__select__'] = 'select `%s`, %s from `%s`' % (primaryKey, ', '.join(escaped_fields), tableName) + attrs['__select__'] = 'select * from `%s`' % (tableName) attrs['__insert__'] = 'insert into `%s` (%s, `%s`) values (%s)' % (tableName, ', '.join(escaped_fields), primaryKey, ', '.join('?' * len(mappings))) attrs['__update__'] = 'update `%s` set %s where `%s`=?' % (tableName, ', '.join(map(lambda f: '`%s`=?' % (mappings.get(f).name or f), fields)), primaryKey) attrs['__delete__'] = 'delete from `%s` where `%s`=?' % (tableName, primaryKey) From 8a5ad8aade5dc5dcd6dc4a87e6198b9f1249720f Mon Sep 17 00:00:00 2001 From: moling3650 <365024424@qq.com> Date: Fri, 20 May 2016 23:52:11 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=E5=9C=A8=E5=8A=A0=E5=85=A5mappings?= =?UTF-8?q?=E5=90=8C=E6=97=B6=E5=88=A0=E9=99=A4attrs=E7=9A=84field?= =?UTF-8?q?=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- www/orm.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/www/orm.py b/www/orm.py index 6a375df..7bb7cf5 100644 --- a/www/orm.py +++ b/www/orm.py @@ -97,15 +97,15 @@ class ModelMetaclass(type): def __new__(cls, name, bases, attrs): if name=='Model': return type.__new__(cls, name, bases, attrs) - tableName = attrs.get('__table__', None) or name + tableName = attrs.get('__table__', name) logging.info('found model: %s (table: %s)' % (name, tableName)) mappings = dict() fields = [] primaryKey = None - for k, v in attrs.items(): + for k, v in attrs.copy().items(): if isinstance(v, Field): logging.info(' found mapping: %s ==> %s' % (k, v)) - mappings[k] = v + mappings[k] = attrs.pop(k) if v.primary_key: # 找到主键: if primaryKey: @@ -115,8 +115,7 @@ def __new__(cls, name, bases, attrs): fields.append(k) if not primaryKey: raise StandardError('Primary key not found.') - for k in mappings.keys(): - attrs.pop(k) + escaped_fields = list(map(lambda f: '`%s`' % f, fields)) attrs['__mappings__'] = mappings # 保存属性和列的映射关系 attrs['__table__'] = tableName From 8bb91f2c44ab572f8415ecf649491d0e01dfe30e Mon Sep 17 00:00:00 2001 From: moling3650 <365024424@qq.com> Date: Sat, 21 May 2016 00:45:37 +0800 Subject: [PATCH 6/7] simply the SQL --- www/orm.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/www/orm.py b/www/orm.py index 7bb7cf5..66fe34e 100644 --- a/www/orm.py +++ b/www/orm.py @@ -100,7 +100,7 @@ def __new__(cls, name, bases, attrs): tableName = attrs.get('__table__', name) logging.info('found model: %s (table: %s)' % (name, tableName)) mappings = dict() - fields = [] + escaped_fields = [] primaryKey = None for k, v in attrs.copy().items(): if isinstance(v, Field): @@ -112,18 +112,17 @@ def __new__(cls, name, bases, attrs): raise StandardError('Duplicate primary key for field: %s' % k) primaryKey = k else: - fields.append(k) + escaped_fields.append(k) if not primaryKey: raise StandardError('Primary key not found.') - escaped_fields = list(map(lambda f: '`%s`' % f, fields)) attrs['__mappings__'] = mappings # 保存属性和列的映射关系 attrs['__table__'] = tableName attrs['__primary_key__'] = primaryKey # 主键属性名 - attrs['__fields__'] = fields # 除主键外的属性名 + attrs['__fields__'] = escaped_fields + [primaryKey] # 全部属性名,主键一定在是最后 attrs['__select__'] = 'select * from `%s`' % (tableName) - attrs['__insert__'] = 'insert into `%s` (%s, `%s`) values (%s)' % (tableName, ', '.join(escaped_fields), primaryKey, ', '.join('?' * len(mappings))) - attrs['__update__'] = 'update `%s` set %s where `%s`=?' % (tableName, ', '.join(map(lambda f: '`%s`=?' % (mappings.get(f).name or f), fields)), primaryKey) + attrs['__insert__'] = 'insert into `%s` (%s) values (%s)' % (tableName, ', '.join('`%s`' % f for f in attrs['__fields__']), ', '.join('?' * len(mappings))) + attrs['__update__'] = 'update `%s` set %s where `%s`=?' % (tableName, ', '.join('`%s`=?' % f for f in escaped_fields), primaryKey) attrs['__delete__'] = 'delete from `%s` where `%s`=?' % (tableName, primaryKey) return type.__new__(cls, name, bases, attrs) @@ -203,14 +202,12 @@ async def find(cls, pk): async def save(self): args = list(map(self.getValueOrDefault, self.__fields__)) - args.append(self.getValueOrDefault(self.__primary_key__)) rows = await execute(self.__insert__, args) if rows != 1: logging.warn('failed to insert record: affected rows: %s' % rows) async def update(self): args = list(map(self.getValue, self.__fields__)) - args.append(self.getValue(self.__primary_key__)) rows = await execute(self.__update__, args) if rows != 1: logging.warn('failed to update by primary key: affected rows: %s' % rows) From 404a24bf9eec833fe9927a3a9ae1d942ed3afe58 Mon Sep 17 00:00:00 2001 From: moling3650 <365024424@qq.com> Date: Sat, 21 May 2016 01:08:28 +0800 Subject: [PATCH 7/7] delete `getValue` method, use `get` --- www/orm.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/www/orm.py b/www/orm.py index 66fe34e..3ec939a 100644 --- a/www/orm.py +++ b/www/orm.py @@ -7,8 +7,8 @@ import aiomysql -def log(sql, args=()): - logging.info('SQL: %s' % sql) +def log(sql, args=[]): + logging.info('SQL: [%s] args: %s' % (sql, args)) async def create_pool(loop, **kw): logging.info('create database connection pool...') @@ -40,7 +40,7 @@ async def select(sql, args, size=None): return rs async def execute(sql, args, autocommit=True): - log(sql) + log(sql, args) async with __pool.get() as conn: if not autocommit: await conn.begin() @@ -140,9 +140,6 @@ def __getattr__(self, key): def __setattr__(self, key, value): self[key] = value - def getValue(self, key): - return getattr(self, key, None) - def getValueOrDefault(self, key): value = getattr(self, key, None) if value is None: @@ -207,13 +204,13 @@ async def save(self): logging.warn('failed to insert record: affected rows: %s' % rows) async def update(self): - args = list(map(self.getValue, self.__fields__)) + args = list(map(self.get, self.__fields__)) rows = await execute(self.__update__, args) if rows != 1: logging.warn('failed to update by primary key: affected rows: %s' % rows) async def remove(self): - args = [self.getValue(self.__primary_key__)] + args = [self.get(self.__primary_key__)] rows = await execute(self.__delete__, args) if rows != 1: logging.warn('failed to remove by primary key: affected rows: %s' % rows)