程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> SQL對冗余數據的刪除反復記載只保存單條的解釋

SQL對冗余數據的刪除反復記載只保存單條的解釋

編輯:MSSQL

SQL對冗余數據的刪除反復記載只保存單條的解釋。本站提示廣大學習愛好者:(SQL對冗余數據的刪除反復記載只保存單條的解釋)文章只能為提供參考,不一定能成為您想要的結果。以下是SQL對冗余數據的刪除反復記載只保存單條的解釋正文


上篇文章簡略引見了python中描寫器(Descriptor)的概念和應用,有心的同窗估量曾經Get√了該技巧。本篇文章經由過程一個Descriptor的應用場景再次給出一個案例,讓不懂得情形的同窗可以更輕易懂得。

先說說decorator

這兩個單詞確切是有些類似,同時在應用中也是形影不離。這也給天然成了懂得上的艱苦,說裝潢器和描寫器究竟是怎樣回事,為何非得用一個@符號再加上描寫器才行。

許多文章也都把這倆聯合著講,我本身看完以後都邑認為很繞。其實進修一個常識點,和做項目開辟一個功效是一樣的。在功效拆分的時刻我們都邑盡可能的把義務拆分的足夠小,然後才分派到開辟者頭上。如許包管各個義務的自力性,完全性,而且易於做進度治理。在義務開辟的時刻也不克不及把你的義務都放到一個函數/接口中去做,以免各功效間發生高耦合的狀態,招致前期難以保護。

再說回到進修一個技巧點,假如你老是測驗考試一會兒就要控制兩個或多個技巧點,成果能夠是忙活了半天,發明照樣蒙頭轉向。

擦,似乎扯遠了。

說Descriptor是Descriptor, Decorator是Decorator,碰到不懂的處所,各個擊破,哪裡不懂點哪裡。所以先說Decorator, 症結點是你要認識到這就是一個語法糖 。所謂語法糖就是讓你可以用簡略的方法寫代碼。實質上裝潢器(Decorator)就是如許:

def decorator(func):
    def wrapper():
        print 'in decorator'
        func()
    return wrapper

def func():
    print 'in func'

# 把func裝潢一下
func = decorator(func)  # 右邊的func實際上是誰人wrapper, 你履行它的時刻會,它會幫你履行func()
# 同等於你在界說func的時刻加上@
@decorator
def func():
    print 'in func'

正題:經由過程Descriptor來做一個類級的Property

罕見的Property是如許的:

class Foo(object):
    _name = 'the5fire'

    @property
    def name(self):
        return self._name

這中property的應用,是實例級的運用。由於只要在 foo = Foo() 以後,才可以 foo.name 。

然則假如我須要一個類級的屬性應當怎樣做呢,就像是 classmethod一樣,不須要實例化類我便可以挪用。對應的需求是如許的,界說了一個基類DBManage:

class DBManage(object):
    @classmethod
    def table_name(cls):
        return cls.__name__.lower()

    @classmethod
    def select_all(cls):
        sql = "SELECT * FROM %s""" % cls.table_name()
        # 履行這個語句的代碼
        return result

這其實一個對應著數據庫中某張表的基本模子,我願望其他的Model都來繼續它,然後可以重用這個table_name的辦法(今朝照樣辦法)。

我只須要這麼界說User模子便可:

class User(DBManage):
    pass

然後這麼界說Post模子:

class Post(DBManage):
    pass

如許我假如須要查一切的User數據,只須要 User.select_all() 便可,同理Post也是如斯 Post.select_all() 。但此時發明一個有點不爽的工作。那就是基類中的 cls.table_name() 這個代碼,table_name看起來就是屬性,卻須要用挪用辦法的方法獲得。不當。

因而自界說了一個classproperty:

class classproperty(object):
    def __init__(self, func):
        self.func = func

    def __get__(self, instance, klass):
        return self.func(klass)

這須要如許,我在DBManage中的代碼便可以改成:

class DBManage(object):
    @classproperty
    def table_name(cls):
        return cls.__name__.lower()

    @classmethod
    def select_all(cls):
        sql = "SELECT * FROM %s""" % cls.table_name  # 何等直不雅

這就是Descriptor別的的一個應用案例了。
能夠有人或有一個小疑問:為毛你不是在sql賦值時直接 sql = "SELECT * FROM %s" % cls.__name__.lower() 。這個成績,問的異常好,緣由就一個字:懶。懶得今後每次都得敲那末多代碼。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved