国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Python工具箱系列(三十四)

這篇具有很好參考價(jià)值的文章主要介紹了Python工具箱系列(三十四)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

SQLAlchemy是著名的ORM(Object Relational Mapping-對(duì)象關(guān)系映射)框架。其主要作用是在編程中,把面向?qū)ο蟮母拍罡鷶?shù)據(jù)庫(kù)中表的概念對(duì)應(yīng)起來(lái)。對(duì)許多語(yǔ)言(例如JAVA/PYTHON)來(lái)說(shuō)就是定義一個(gè)對(duì)象,并且這個(gè)對(duì)象對(duì)應(yīng)著一張數(shù)據(jù)庫(kù)的表。而這個(gè)對(duì)象的實(shí)例,就對(duì)應(yīng)著表中的一條記錄。

其整體思路如下圖所示:

Python工具箱系列(三十四)

其中類、對(duì)象與屬性與數(shù)據(jù)庫(kù)相關(guān)內(nèi)容的對(duì)應(yīng)關(guān)系如下圖所示:

Python工具箱系列(三十四)

ORM的優(yōu)點(diǎn):

?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-463125.html

  • 數(shù)據(jù)模型與代碼統(tǒng)一定義,更新與維護(hù)簡(jiǎn)單,代碼高度重用一致。

  • ORM有現(xiàn)成的工具,很多功能都可以自動(dòng)完成,比如表格增刪、預(yù)處理、事務(wù)等。

  • 基于ORM的業(yè)務(wù)代碼比較簡(jiǎn)單,代碼量少,語(yǔ)義性好,容易理解。

  • 你不必編寫性能不佳的SQL。

ORM的缺點(diǎn):

?

  • ORM庫(kù)多層封裝,實(shí)現(xiàn)巧妙,需要花很多精力學(xué)習(xí)和設(shè)置。

  • 對(duì)于復(fù)雜的查詢,ORM要么是無(wú)法表達(dá),要么是性能不如原生的SQL。

  • ORM抽象掉了數(shù)據(jù)庫(kù)層,開發(fā)者無(wú)法了解底層的數(shù)據(jù)庫(kù)操作,也無(wú)法定制一些特殊的SQL。

?

?

?從整體上看,ORM節(jié)省了開發(fā)時(shí)間,減少了代碼錯(cuò)誤的可能性,同時(shí)能夠方便地在多個(gè)數(shù)據(jù)庫(kù)間靈活遷移,還是非常值得使用。而在python語(yǔ)言中,SQLAlchemy是著名的ORM框架之一,它的整體架構(gòu)如下圖所示:

Python工具箱系列(三十四)

從圖中可以看出,SQLAIchemy是分層架構(gòu),由Core以及ORM兩部分組成。其中,Core完成了與數(shù)據(jù)庫(kù)操作的各類封閉,是相對(duì)低層的。而ORM層則利用Core層的能力進(jìn)行更宏觀的操作。因此,在一段python代碼中,使用Core與ORM層同時(shí)來(lái)操作數(shù)據(jù)庫(kù)也是可行的,并不矛盾與沖突。

下面先從最基本的表格創(chuàng)建做起。非ORM編程中,表格的創(chuàng)建無(wú)非兩個(gè)途徑:

●基于DBMS本身提供的CLI/GUI界面,發(fā)出DDL語(yǔ)句進(jìn)行數(shù)據(jù)庫(kù)/表格本身的增刪改查。

●使用語(yǔ)言連接數(shù)據(jù)庫(kù)后,發(fā)出命令來(lái)對(duì)數(shù)據(jù)庫(kù)/表格進(jìn)行增刪改查。

而由于每種數(shù)據(jù)庫(kù)都有自己的方言,所以命令語(yǔ)句各有差異,需要不斷地調(diào)整。而使用SQLAlchemy則實(shí)現(xiàn)了代碼統(tǒng)一。例如以下代碼在mssql以及mysql上創(chuàng)建表格,并且可以查詢表格的元數(shù)據(jù),以及插入數(shù)據(jù)后的查詢。

from sqlalchemy import (Column, Integer, MetaData, String, Table,
                        create_engine, text, Float, DateTime, ForeignKey)
from sqlalchemy_utils.functions import create_database, database_exists

configure_pg = {"user": "postgres",
                'password': '88488848',
                'dns': 'dbserver.home',
                "port": 5432,
                'prefix': 'postgresql+psycopg2',
                'postfix': ''
                }

configure_mssql = {"user": "sa",
                   'password': '88488848',
                   'dns': 'dbserver.home',
                   "port": 1433,
                   'prefix': 'mssql+pymssql',
                   'postfix': '?charset=utf8'
                   }

configure_mysql = {"user": "root",
                   'password': '88488848',
                   'dns': 'dbserver.home',
                   "port": 3306,
                   'prefix': 'mysql+mysqlconnector',
                   'postfix': ''
                   }

config = {'mssql': configure_mssql,
          'mysql': configure_mysql, 'postgresql': configure_pg}

database_name = 'testdb'
table_sensor_location = "sensor_location"
table_sensor_data = "sensor_data"


def linkdb(targetstr):
    """
    連接不同的數(shù)據(jù)庫(kù)

    Args:
        targetstr (string): 數(shù)據(jù)庫(kù)名稱

    Returns:
        engine: 用于后續(xù)的數(shù)據(jù)庫(kù)連接
    """
    if targetstr in config.keys():
        item = config[targetstr]
        connectstring = f"{item['prefix']}://{item['user']}:{item['password']}@{item['dns']}:{item['port']}/{database_name}{item['postfix']}"
        engine = create_engine(connectstring, echo=True, future=True)

    # 如果數(shù)據(jù)庫(kù)不存在,則創(chuàng)建之
    if not database_exists(engine.url):
        create_database(engine.url)

    # 做一個(gè)測(cè)試,不針對(duì)任何表
    with engine.connect() as conn:
        result = conn.execute(text("select 'hello world'"))
        print(result.all())
    return engine


def createtbs(connector):
    """"
    創(chuàng)建數(shù)據(jù)庫(kù)中的2張表。用于保存?zhèn)鞲衅鲾?shù)據(jù)與傳感器本身的信息
    """
    metadata_obj = MetaData()

    # 描述傳感器的表
    sensor_location_tb = Table(
        table_sensor_location,
        metadata_obj,
        Column('id', Integer, primary_key=True, autoincrement=False),
        Column('location', String(30), nullable=False)
    )

    # 保存?zhèn)鞲衅鲾?shù)據(jù)的表
    sensor_data_tb = Table(
        table_sensor_data,
        metadata_obj,
        Column('id', Integer, primary_key=True, autoincrement=False),
        Column('sensor_id', ForeignKey(
            f'{table_sensor_location}.id'), nullable=False),
        Column('area', String(30)),
        Column('pm25', Float),
        Column('timestamp', DateTime)
    )
    print(sensor_data_tb.compile())

    # 創(chuàng)建并返回表
    metadata_obj.create_all(connector)
    return sensor_data_tb, sensor_location_tb


def tableinfo(connector, tablename):
    """
    獲得指定表名的相關(guān)元數(shù)據(jù)信息

    Args:
        connector (engine): 數(shù)據(jù)庫(kù)連接器
        tablename (string): 要查詢的表名
    """
    metadata_obj = MetaData()
    some_table = Table(tablename, metadata_obj, autoload_with=connector)
    print([c.name for c in some_table.columns])


def gensonsorinfo(connector):
    with connector.connect() as conn:
        conn.execute(text(f"INSERT INTO {table_sensor_location} (id, location) VALUES (:x, :y)"),
                     [{"x": 1, "y": '1號(hào)樓'}, {"x": 2, "y": '2號(hào)樓'}])

        conn.commit()

        result = conn.execute(
            text(f"SELECT id, location FROM {table_sensor_location}"))
        for x, y in result:
            print(f"id: {x}  location: {y}")


# 依次連接多個(gè)數(shù)據(jù)庫(kù)。從而驗(yàn)證代碼的一致性
for dbname in config.keys():
    con = linkdb(dbname)
    createtbs(con)
    tableinfo(con, table_sensor_data)
    tableinfo(con, table_sensor_location)
    gensonsorinfo(con)

從代碼可以看出,可以用統(tǒng)一的訪問(wèn)方式來(lái)操作mssql/mysql/postgresql三種數(shù)據(jù)庫(kù)。而且,以上方式與前文中的基于游標(biāo)的寫法類似。

?

到了這里,關(guān)于Python工具箱系列(三十四)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Python工具箱系列(三十三)

    Python工具箱系列(三十三)

    Timescaledb 在物聯(lián)網(wǎng)時(shí)代,出現(xiàn)了大量以時(shí)間為中心海量產(chǎn)生的傳感器數(shù)據(jù),稱為時(shí)序數(shù)據(jù)。這類數(shù)據(jù)的特點(diǎn)是: 數(shù)據(jù)記錄總有一個(gè)時(shí)間戳。 數(shù)據(jù)幾乎總是追加,不更新也不刪除。 大量使用近期的數(shù)據(jù)。很少更新或者回填時(shí)間間隔的缺失數(shù)據(jù)。 與時(shí)間間隔頻率關(guān)系不大。但累

    2024年02月06日
    瀏覽(20)
  • Python工具箱系列(三十一)

    Python工具箱系列(三十一)

    Neo4j是一個(gè)高性能的開源的,使用Java語(yǔ)言實(shí)現(xiàn)的NoSQL圖數(shù)據(jù)庫(kù),它將結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)在網(wǎng)絡(luò)上而不是表中。它是一個(gè)嵌入式的、基于磁盤的、具備完全的事務(wù)特性的Java持久化引擎,但是它將結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)在網(wǎng)絡(luò)(從數(shù)學(xué)角度叫做圖)上而不是表中。Neo4j也可以被看作是一個(gè)

    2024年02月03日
    瀏覽(19)
  • Python工具箱系列(三十六)

    基于Docker的數(shù)據(jù)庫(kù)開發(fā)環(huán)境 前文介紹了sqlite/mysql/mssql等數(shù)據(jù)庫(kù)系統(tǒng)在ubuntu的安裝與部署過(guò)程,相對(duì)是比較復(fù)雜的,需要耐心等待下載以及排除各種故障,對(duì)于開發(fā)人員來(lái)說(shuō)是不太友好。在某些情況下,開發(fā)人員要測(cè)試在多個(gè)數(shù)據(jù)庫(kù)環(huán)境下軟件的正確性,需要部署多個(gè)數(shù)據(jù)庫(kù),

    2024年02月09日
    瀏覽(23)
  • Python工具箱系列(四十一)

    Python工具箱系列(四十一)

    ? ? ? ?前文的代碼示例了使用gzip對(duì)單個(gè)文件進(jìn)行壓縮。本文示例使用更通用的zipfile來(lái)批量壓縮文件。zipfile也是python內(nèi)置的庫(kù),使用起來(lái)非常方便。廢話不說(shuō),直接上代碼示例。 ? ? ? ?上述示例代碼中,再次引入一個(gè)python內(nèi)置的輕量級(jí)數(shù)據(jù)庫(kù)dbm。與shelve類似,也是key-val

    2024年02月11日
    瀏覽(30)
  • IDEA插件系列(4):GitToolBox插件——git工具箱

    IDEA插件系列(4):GitToolBox插件——git工具箱

    GitToolBox 提供各種git操作。 第一種安裝方式是使用IDEA下載安裝 第二種安裝方式是使用離線插件進(jìn)行安裝 插件下載地址:http://plugins.jetbrains.com/plugin/7499-gittoolbox 在這里進(jìn)行配置 更多可參考文檔 https://github.com/zielu/GitToolBox/wiki/Manual 作用:顯示當(dāng)前代碼提交的用戶名、時(shí)間、以

    2024年02月11日
    瀏覽(22)
  • HNU-離散數(shù)學(xué)-工具箱系列3-關(guān)系矩陣法求傳遞閉包

    HNU-離散數(shù)學(xué)-工具箱系列3-關(guān)系矩陣法求傳遞閉包

    用于解決這類問(wèn)題: 舉例一、 ?舉例二、(求傳遞閉包) ? 代碼如下:

    2024年02月11日
    瀏覽(23)
  • python實(shí)現(xiàn)視頻抽幀,文件批量操作,文件批量處理(數(shù)據(jù)集制作的工具箱)

    環(huán)境準(zhǔn)備 數(shù)據(jù)集制作 文件批量重命名 文件批量移動(dòng) 將文件批量按照一定格式進(jìn)行重命名 修改xml文件內(nèi)容的方法 Pathlib庫(kù)的常用接口 在計(jì)算機(jī)視覺項(xiàng)目中,文件批量操作和文件批量預(yù)處理是必不可少的步驟。它們涉及處理大量的圖像文件,包括讀取、處理、保存和預(yù)處理。

    2024年02月09日
    瀏覽(18)
  • 密碼算法工具箱

    密碼算法工具箱

    這是一個(gè)密碼算法工具箱軟件,包含大多數(shù)密碼鍵盤的算法,您可以利用他做加解密、校驗(yàn)或者其他功能。 ①本工具包含對(duì)稱密鑰算法、MAC算法、PINBLOCK算法、Hash算法、非對(duì)稱密鑰算法的常用功能。 ②支持國(guó)際(RSA、DES、3DES)和國(guó)密(SM2、SM3、SM4)算法。 ③支持windows和l

    2024年01月19日
    瀏覽(25)
  • 29 旋轉(zhuǎn)工具箱

    29 旋轉(zhuǎn)工具箱

    實(shí)現(xiàn)了一個(gè)菜單按鈕的動(dòng)畫效果,當(dāng)鼠標(biāo)懸停在菜單按鈕上時(shí),菜單按鈕會(huì)旋轉(zhuǎn)315度,菜單按鈕旋轉(zhuǎn)的同時(shí),菜單按鈕旋轉(zhuǎn)的8個(gè)小圓圈也會(huì)依次旋轉(zhuǎn)360度,并且每個(gè)小圓圈的旋轉(zhuǎn)方向和菜單按鈕的旋轉(zhuǎn)方向相反,當(dāng)鼠標(biāo)懸停在某個(gè)小圓圈上時(shí),該小圓圈的旋轉(zhuǎn)方向會(huì)變?yōu)轫槙r(shí)

    2024年01月18日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包