sqlalchemy 動(dòng)態(tài)建表的一種方法

sqlalchemy 利用已存在表結(jié)構(gòu)建立新表并生成新的model類的方法:

# coding: utf-8
import traceback

import datetime
from sqlalchemy import (BigInteger, Column, DateTime, Integer, MetaData, String, Table, create_engine, text)
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import mapper
from sqlalchemy.schema import CreateTable


# 本地?cái)?shù)據(jù)庫(kù)
engineLocal = create_engine('mysql+cymysql://root:password@192.168.0.111:3306/pop')


BaseSQL = declarative_base()
metadata = MetaData()


def dictToObj(results, to_class):
    """將字典list或者字典轉(zhuǎn)化為指定類的對(duì)象list或指定類的對(duì)象
    python 支持動(dòng)態(tài)給對(duì)象添加屬性斟或,所以字典中存在而該類不存在的會(huì)直接添加到對(duì)應(yīng)對(duì)象
    """
    if isinstance(results, list):
        objL = []
        for result in results:
            obj = to_class()
            for r in result.keys():
                obj.__setattr__(r, result[r])
            objL.append(obj)
        return objL
    else:
        try:
            obj = to_class()
            for r in results.keys():
                obj.__setattr__(r, results[r])
            return obj
        except Exception as e:
            print(e)
            traceback.print_exc()
            return None
    # else:
    #     print("傳入對(duì)象非字典或者list")
    #     return None


def getModel(name, engine):
    """根據(jù)name創(chuàng)建并return一個(gè)新的model類
    name:數(shù)據(jù)庫(kù)表名
    engine:create_engine返回的對(duì)象读串,指定要操作的數(shù)據(jù)庫(kù)連接个束,from sqlalchemy import create_engine
    """
    BaseSQL.metadata.reflect(engine)
    table = BaseSQL.metadata.tables[name]
    t = type(name, (object,), dict())
    mapper(t, table)
    BaseSQL.metadata.clear()
    return t


def createTableFromTable(name, tableNam, engine):
    """copy一個(gè)已有表的結(jié)構(gòu),并創(chuàng)建新的表
    """
    metadata = MetaData(engine)
    BaseSQL.metadata.reflect(engine)
    # 獲取原表對(duì)象
    table = BaseSQL.metadata.tables[tableNam]
    # 獲取原表建表語(yǔ)句
    c = str(CreateTable(table))
    print(c)
    print(tableNam, name)
    # 替換表名
    c = c.replace('"', '').replace('CREATE TABLE {}'.format(tableNam), "CREATE TABLE if not exists {}".format(name))
    print(c)
    db_conn = engine.connect()
    db_conn.execute(c)
    db_conn.close()
    BaseSQL.metadata.clear()


def getNewModel(name, tableNam, engine):
    """copy一個(gè)表的表結(jié)構(gòu)并創(chuàng)建新的名為name的表并返回model類
    name:數(shù)據(jù)庫(kù)表名
    tableNam:copy的表表名
    engine:create_engine返回的對(duì)象桨踪,指定要操作的數(shù)據(jù)庫(kù)連接,from sqlalchemy import create_engine
    """
    createTableFromTable(name, tableNam, engine)
    return getModel(name, engine)


def drop_table(name, engine):
    drop_sql = "DROP TABLE if exists {}".format(name)
    db_conn = engine.connect()
    db_conn.execute(drop_sql)
    db_conn.close()


if __name__ == "__main__":
    t = datetime.date.today().__str__()
    name = "test_{}".format(''.join(t.split('-')))
    # tableNam = 'interaction_CM191001'
    # getNewModel(name, tableNam, engineLocal)
    createTableFromTable(name, 'security_daily_evaluation', engineLocal)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鞠绰,更是在濱河造成了極大的恐慌,老刑警劉巖飒焦,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜈膨,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡牺荠,警方通過(guò)查閱死者的電腦和手機(jī)翁巍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)休雌,“玉大人灶壶,你說(shuō)我怎么就攤上這事¤厩” “怎么了驰凛?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)鱼蝉。 經(jīng)常有香客問(wèn)我洒嗤,道長(zhǎng),這世上最難降的妖魔是什么魁亦? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮羔挡,結(jié)果婚禮上洁奈,老公的妹妹穿的比我還像新娘。我一直安慰自己绞灼,他們只是感情好利术,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著低矮,像睡著了一般印叁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,821評(píng)論 1 290
  • 那天轮蜕,我揣著相機(jī)與錄音昨悼,去河邊找鬼。 笑死跃洛,一個(gè)胖子當(dāng)著我的面吹牛率触,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播汇竭,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼葱蝗,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了细燎?” 一聲冷哼從身側(cè)響起两曼,我...
    開(kāi)封第一講書(shū)人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎玻驻,沒(méi)想到半個(gè)月后悼凑,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡击狮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年佛析,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彪蓬。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡寸莫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出档冬,到底是詐尸還是另有隱情膘茎,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布酷誓,位于F島的核電站披坏,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏盐数。R本人自食惡果不足惜棒拂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望玫氢。 院中可真熱鬧帚屉,春花似錦、人聲如沸漾峡。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)生逸。三九已至牢屋,卻和暖如春且预,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背烙无。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工锋谐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人皱炉。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓怀估,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親合搅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子多搀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載,覺(jué)得這篇寫(xiě) SQLAlchemy Core灾部,寫(xiě)得非常不錯(cuò)康铭。不過(guò)后續(xù)他沒(méi)寫(xiě)SQLAlchemy ORM... ...
    非夢(mèng)nj閱讀 5,379評(píng)論 1 14
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,092評(píng)論 1 32
  • MySQL 命令大全 DDL(數(shù)據(jù)定義語(yǔ)句) CREATE TABLE/DATABASE ALTER TABLE/...
    子非初心閱讀 3,402評(píng)論 0 2
  • 《面紗》是美國(guó)導(dǎo)演約翰卡倫根據(jù)英國(guó)小說(shuō)家毛姆的同名小說(shuō)改編的電影,但電影大部分是在中國(guó)拍攝取景的赌髓,鏡頭下古樸的中國(guó)...
    楊春艷的番茄園閱讀 4,881評(píng)論 0 0
  • ‘看到評(píng)論一直想看的電影从藤,看看女人的不易,電影在李捷(姚晨飾)發(fā)了瘋似的在垃圾堆里找孩子拉開(kāi)了序幕锁蠕,整場(chǎng)電影我沒(méi)有...
    彰雅柔閱讀 156評(píng)論 1 1