最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實(shí)現(xiàn)連接MySQL數(shù)據(jù)庫的常見方法總結(jié)

 更新時(shí)間:2023年05月19日 09:23:27   作者:歡樂馬10  
這篇文章主要為大家介紹了兩種Python中用來連接 MySQL 數(shù)據(jù)庫的方法,并且針對這兩種方法,我們還將對代碼進(jìn)行封裝和優(yōu)化,提高程序的可讀性和健壯性,需要的可以收藏一下

在實(shí)際數(shù)據(jù)分析和建模過程中,我們通常需要從數(shù)據(jù)庫中讀取數(shù)據(jù),并將其轉(zhuǎn)化為 Pandas dataframe 對象進(jìn)行進(jìn)一步處理。而 MySQL 數(shù)據(jù)庫是最常用的關(guān)系型數(shù)據(jù)庫之一,因此在 Python 中如何連接 MySQL 數(shù)據(jù)庫并查詢數(shù)據(jù)成為了一個(gè)重要的問題。

本文將介紹兩種方法來連接 MySQL 數(shù)據(jù)庫,并將查詢結(jié)果轉(zhuǎn)化為 Pandas dataframe 對象:第一種方法使用 pymysql 庫來連接 MySQL 數(shù)據(jù)庫;第二種方法則使用 SQLAlchemy 的 create_engine 函數(shù)創(chuàng)建 MySQL 數(shù)據(jù)庫連接引擎。同時(shí),針對這兩種方法,我們還將對代碼進(jìn)行封裝和優(yōu)化,提高程序的可讀性和健壯性。

方法一:使用 pymysql 庫連接 MySQL 數(shù)據(jù)庫

步驟 1:連接 MySQL 數(shù)據(jù)庫

首先,我們需要使用 pymysql 庫來連接 MySQL 數(shù)據(jù)庫。具體代碼如下:

import pymysql

# 連接 MySQL 數(shù)據(jù)庫
conn = pymysql.connect(
    host='159.xxx.xxx.216',  # 主機(jī)名
    port=3306,         # 端口號(hào),MySQL默認(rèn)為3306
    user='xxxx',       # 用戶名
    password='xxxx', # 密碼
    database='xx',   # 數(shù)據(jù)庫名稱
)

在上面的代碼中,我們通過 pymysql 庫的 connect() 函數(shù)連接 MySQL 數(shù)據(jù)庫,并指定主機(jī)名、端口號(hào)、用戶名、密碼和數(shù)據(jù)庫名稱等參數(shù)。如果連接成功,則該函數(shù)將返回一個(gè)數(shù)據(jù)庫連接對象 conn。

步驟 2:執(zhí)行 SQL 查詢語句

連接 MySQL 數(shù)據(jù)庫之后,我們就可以使用游標(biāo)對象來執(zhí)行 SQL 查詢語句,如下所示:

# 創(chuàng)建游標(biāo)對象
cursor = conn.cursor()
# 執(zhí)行 SQL 查詢語句
cursor.execute("SELECT * FROM users WHERE gender='female'")
# 獲取查詢結(jié)果
result = cursor.fetchall()

在上面的代碼中,我們使用 cursor() 方法創(chuàng)建游標(biāo)對象 cursor,并使用 execute() 方法執(zhí)行 SQL 查詢語句。在執(zhí)行查詢時(shí),我們可以使用任何符合 MySQL 語法的 SQL 查詢語句。最后,我們使用 fetchall() 方法獲取查詢結(jié)果。

步驟 3:將查詢結(jié)果轉(zhuǎn)化為 Pandas dataframe 對象

獲取查詢結(jié)果之后,我們需要將其轉(zhuǎn)化為 Pandas dataframe 對象,以便于進(jìn)行進(jìn)一步的數(shù)據(jù)處理和分析。具體代碼如下

import pandas as pd
# 將查詢結(jié)果轉(zhuǎn)化為 Pandas dataframe 對象
df = pd.DataFrame(result, columns=[i[0] for i in cursor.description])

在上面的代碼中,我們使用 pd.DataFrame() 方法將查詢結(jié)果轉(zhuǎn)化為 Pandas dataframe 對象。在轉(zhuǎn)化過程中,我們需要指定字段名,可以通過游標(biāo)對象的 description 屬性來獲取查詢結(jié)果的元數(shù)據(jù),其中包括字段名等信息。

步驟 4:關(guān)閉游標(biāo)和數(shù)據(jù)庫連接

最后,我們需要關(guān)閉游標(biāo)對象和數(shù)據(jù)庫連接,以釋放資源。具體代碼如下:

# 關(guān)閉游標(biāo)和數(shù)據(jù)庫連接
cursor.close()
conn.close()

方法二:使用 SQLAlchemy 的 create_engine 函數(shù)連接 MySQL 數(shù)據(jù)庫

除了使用 pymysql 庫連接 MySQL 數(shù)據(jù)庫之外,我們還可以使用 SQLAlchemy 的 create_engine 函數(shù)創(chuàng)建 MySQL 數(shù)據(jù)庫連接引擎,并使用 Pandas 庫中的 read_sql 函數(shù)直接將查詢結(jié)果轉(zhuǎn)化為 Pandas dataframe 對象。

# 步驟 1:創(chuàng)建 MySQL 數(shù)據(jù)庫連接引擎
from sqlalchemy import create_engine
# 創(chuàng)建 MySQL 數(shù)據(jù)庫連接引擎
engine = create_engine('mysql+pymysql://username:password@host:port/database')
步驟 2:執(zhí)行 SQL 查詢語句并將結(jié)果轉(zhuǎn)化為 Pandas dataframe 對象
import pandas as pd
# 執(zhí)行 SQL 查詢語句,并將結(jié)果轉(zhuǎn)化為 Pandas dataframe 對象
df = pd.read_sql("SELECT * FROM users WHERE gender='female'", con=engine)
# 關(guān)閉數(shù)據(jù)庫連接
engine.dispose()

在上面的代碼中,我們使用 create_engine 函數(shù)創(chuàng)建了一個(gè) MySQL 數(shù)據(jù)庫連接引擎。其中,我們需要將數(shù)據(jù)庫連接信息輸入到一個(gè)字符串中,并作為函數(shù)的參數(shù)傳入。其中,username 和 password 分別表示登錄 MySQL 數(shù)據(jù)庫所需的用戶名和密碼,host 和 port 表示 MySQL 數(shù)據(jù)庫的主機(jī)名和端口號(hào),database 表示要連接的 MySQL 數(shù)據(jù)庫名稱。

接著使用使用 pd.read_sql() 函數(shù)執(zhí)行 SQL 查詢語句,并將數(shù)據(jù)庫連接引擎對象 engine 作為參數(shù)傳入。在執(zhí)行查詢時(shí),我們可以使用任何符合 MySQL 語法的 SQL 查詢語句。最后,該函數(shù)將返回查詢結(jié)果的 Pandas dataframe 對象。

最后,我們需要關(guān)閉數(shù)據(jù)庫連接,以釋放資源。

函數(shù)封裝

以上介紹了兩種方法來連接 MySQL 數(shù)據(jù)庫,并將查詢結(jié)果轉(zhuǎn)化為 Pandas dataframe 對象。為了方便重復(fù)使用,我們可以將這些代碼封裝成一個(gè)函數(shù)。

import pandas as pd
import pymysql
from sqlalchemy import create_engine
def query_mysql(sql_query, host=None, port=None, user=None, password=None, database=None, engine=None):
    """
    連接 MySQL 數(shù)據(jù)庫,執(zhí)行查詢,并將查詢結(jié)果轉(zhuǎn)化為 Pandas DataFrame 對象。
    :param sql_query: SQL 查詢語句
    :param host: 主機(jī)名,默認(rèn)為 None
    :param port: 端口號(hào),默認(rèn)為 None
    :param user: 用戶名,默認(rèn)為 None
    :param password: 密碼,默認(rèn)為 None
    :param database: 數(shù)據(jù)庫名稱,默認(rèn)為 None
    :param engine: SQLAlchemy 的數(shù)據(jù)庫引擎對象,默認(rèn)為 None
    :return: Pandas DataFrame 對象
    """
    # 如果未提供數(shù)據(jù)庫連接引擎,則使用 pymysql 庫連接 MySQL 數(shù)據(jù)庫
    if engine is None:
        # 連接 MySQL 數(shù)據(jù)庫
        conn = pymysql.connect(
            host=host,
            port=port,
            user=user,
            password=password,
            database=database,
        )
        # 創(chuàng)建游標(biāo)對象
        cursor = conn.cursor()
        # 執(zhí)行 SQL 查詢語句
        cursor.execute(sql_query)
        # 獲取查詢結(jié)果
        result = cursor.fetchall()
        # 將查詢結(jié)果轉(zhuǎn)化為 Pandas DataFrame 對象
        df = pd.DataFrame(result, columns=[i[0] for i in cursor.description])
        # 關(guān)閉游標(biāo)和數(shù)據(jù)庫連接
        cursor.close()
        conn.close()
    # 如果已提供數(shù)據(jù)庫連接引擎,則使用 SQLAlchemy 庫連接 MySQL 數(shù)據(jù)庫
    else:
        # 執(zhí)行 SQL 查詢語句,并將結(jié)果轉(zhuǎn)化為 Pandas DataFrame 對象
        df = pd.read_sql(sql_query, con=engine)
    return df

在上面的代碼中,我們創(chuàng)建了一個(gè)名為 query_mysql 的函數(shù),用于連接 MySQL 數(shù)據(jù)庫,并執(zhí)行查詢操作。該函數(shù)接受以下參數(shù):

  • sql_query:SQL 查詢語句;
  • host:主機(jī)名,默認(rèn)為 None;
  • port:端口號(hào),默認(rèn)為 None;
  • user:用戶名,默認(rèn)為 None;
  • password:密碼,默認(rèn)為 None;
  • database:數(shù)據(jù)庫名稱,默認(rèn)為 None;
  • engine:SQLAlchemy 的數(shù)據(jù)庫引擎對象,默認(rèn)為 None。

在函數(shù)中,我們首先判斷是否已提供數(shù)據(jù)庫連接引擎對象。如果未提供,則使用 pymysql 庫連接MySQL 數(shù)據(jù)庫,并執(zhí)行查詢操作,步驟與前面的第一種方法相同。如果已提供數(shù)據(jù)庫連接引擎對象,則使用 SQLAlchemy 庫連接 MySQL 數(shù)據(jù)庫,并執(zhí)行查詢操作,步驟與前面的第二種方法相同。

最后,在函數(shù)中我們返回查詢結(jié)果的 Pandas dataframe 對象。

# 使用 pymysql 庫連接 MySQL 數(shù)據(jù)庫
df1 = query_mysql(
    sql_query="SELECT * FROM users WHERE gender='female'",
    host='159.xxx.xxx.216',  # 主機(jī)名
    port=3306,         # 端口號(hào),MySQL默認(rèn)為3306
    user='xxxx',       # 用戶名
    password='xxxx', # 密碼
    database='xx',   # 數(shù)據(jù)庫名稱
)
# 使用 SQLAlchemy 庫連接 MySQL 數(shù)據(jù)庫
engine = create_engine('mysql+pymysql://xxx:xxx@localhost:3306/ad')
df2 = query_mysql(sql_query="SELECT * FROM users WHERE gender='female'", engine=engine)

通過使用 query_mysql 函數(shù),我們可以更加方便地連接 MySQL 數(shù)據(jù)庫并查詢數(shù)據(jù),并且代碼量更少、可讀性更好。同時(shí),由于該函數(shù)使用了 pymysql 和 SQLAlchemy 兩個(gè)庫,因此也具有較好的跨平臺(tái)性,可以在不同的操作系統(tǒng)和環(huán)境下運(yùn)行。

最后也分享一下個(gè)人通過使用的模板:

# 法一:
import pymysql
import pandas as pd
def query_data(sql_query):
    # 連接數(shù)據(jù)庫
    conn = pymysql.connect(
        host='xxx.xxx.xxx.xxx',  # 主機(jī)名
        port=3306,         # 端口號(hào),MySQL默認(rèn)為3306
        user='xxx',       # 用戶名
        password='xxx', # 密碼
        database='xxx',   # 數(shù)據(jù)庫名稱
    )
    try:
        # 創(chuàng)建游標(biāo)對象
        cursor = conn.cursor()
        # 執(zhí)行 SQL 查詢語句
        cursor.execute(sql_query)
        # 獲取查詢結(jié)果
        result = cursor.fetchall()
        # 獲取查詢結(jié)果的字段名和元數(shù)據(jù)
        columns = [col[0] for col in cursor.description]
        # 將查詢結(jié)果封裝到 Pandas DataFrame 中
        df = pd.DataFrame(result, columns=columns)
        return df
    finally:
        # 關(guān)閉游標(biāo)和連接
        cursor.close()
        conn.close()
db_data = query_data(sql_query)
# 法二:
from sqlalchemy import create_engine
import pandas as pd
def getdata_from_db(query, db, host='xxx.xxx.xxx.xxx', port=3306, user='xxx', password='xxx'):
    try:
        engine = create_engine(f'mysql+pymysql://{user}:{password}@{host}:{port}/{db}?charset=utf8')
        # 使用 with 語句自動(dòng)管理連接的生命周期
        with engine.connect() as conn:
            data = pd.read_sql(query, conn)
        return data
    except Exception as e:
        print(f"Error occurred when executing SQL query: {e}")
        return None
db_data = getdata_from_db(sql_query, 'ad')
# 法三:超級精簡版
from sqlalchemy import create_engine
import pandas as pd
engine = create_engine(f'mysql+pymysql://xxx:xxx@xxx:3306/xx?charset=utf8')
db_data = pd.read_sql(sql, engine)
db_data.head()

最后,說一下在訪問數(shù)據(jù)庫時(shí),可能存在一些潛在的問題和注意事項(xiàng)。

  • 首先,在使用 pandas.read_sql() 時(shí),需要在 SQL 查詢語句中包含所有必要的過濾條件、排序方式等信息,以確保返回的結(jié)果集合是正確的,而不是整個(gè)表或視圖中的所有數(shù)據(jù)。如果沒有限制返回的數(shù)據(jù)量,可能會(huì)導(dǎo)致內(nèi)存溢出或其他性能問題。因此,在實(shí)際應(yīng)用中,推薦使用 LIMIT 等關(guān)鍵字來設(shè)置最大返回?cái)?shù)據(jù)量,以便更好地控制查詢結(jié)果。
  • 其次,在實(shí)際生產(chǎn)環(huán)境中,為了避免泄漏敏感信息和減少攻擊面,建議將數(shù)據(jù)庫連接字符串等敏感信息存儲(chǔ)在單獨(dú)的配置文件中,并且只授權(quán)給有限的用戶使用。另外,在向 SQL 查詢語句中傳遞參數(shù)時(shí),也需要進(jìn)行安全過濾和轉(zhuǎn)義,以避免 SQL 注入等安全問題。
  • 最后,在使用完畢后,需要及時(shí)關(guān)閉數(shù)據(jù)庫連接,以釋放資源并減少數(shù)據(jù)庫服務(wù)器的負(fù)載?;蛘撸梢允褂?with 語句自動(dòng)管理連接的生命周期。

總之,學(xué)習(xí)如何連接 MySQL 數(shù)據(jù)庫并將查詢結(jié)果轉(zhuǎn)化為 Pandas dataframe 對象是數(shù)據(jù)分析和建模過程中的重要一步。

到此這篇關(guān)于Python實(shí)現(xiàn)連接MySQL數(shù)據(jù)庫的常見方法總結(jié)的文章就介紹到這了,更多相關(guān)Python連接MySQL內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • macbook如何徹底刪除python的實(shí)現(xiàn)方法

    macbook如何徹底刪除python的實(shí)現(xiàn)方法

    本文主要介紹了macbook如何徹底刪除python的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 基于fastapi框架的異步解讀

    基于fastapi框架的異步解讀

    這篇文章主要介紹了基于fastapi框架的異步解讀,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Python可迭代對象、迭代器與生成器實(shí)現(xiàn)示例詳解

    Python可迭代對象、迭代器與生成器實(shí)現(xiàn)示例詳解

    在Python編程中,生成器、可迭代對象和迭代器是三個(gè)非常重要的概念,它們在處理數(shù)據(jù)序列時(shí)起到關(guān)鍵作用,這篇文章主要介紹了Python可迭代對象、迭代器與生成器的相關(guān)資料,需要的朋友可以參考下
    2025-08-08
  • python執(zhí)行js腳本報(bào)錯(cuò)CryptoJS is not defined問題

    python執(zhí)行js腳本報(bào)錯(cuò)CryptoJS is not defined問題

    這篇文章主要介紹了python執(zhí)行js腳本報(bào)錯(cuò)CryptoJS is not defined問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • python 循環(huán)while和for in簡單實(shí)例

    python 循環(huán)while和for in簡單實(shí)例

    下面小編就為大家?guī)硪黄猵ython 循環(huán)while和for in簡單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-08-08
  • 一文分析提升Python性能的10個(gè)智能技巧

    一文分析提升Python性能的10個(gè)智能技巧

    Python 提供了很多內(nèi)置功能和優(yōu)化技巧,可以顯著提高代碼的運(yùn)行速度,本文將和大家分享提升 Python 性能的 10 個(gè)智能技巧,有需要的小伙伴要了解下
    2025-11-11
  • Python2.6版本pip安裝步驟解析

    Python2.6版本pip安裝步驟解析

    這篇文章主要介紹了Python2.6版本pip安裝步驟解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • python excel多行合并的方法

    python excel多行合并的方法

    這篇文章主要介紹了python excel多行合并的方法,幫助大家更好的利用python處理excel表格,感興趣的朋友可以了解下
    2020-12-12
  • Python寫的一個(gè)簡單監(jiān)控系統(tǒng)

    Python寫的一個(gè)簡單監(jiān)控系統(tǒng)

    這篇文章主要介紹了Python寫的一個(gè)簡單監(jiān)控系統(tǒng),本文講解了詳細(xì)的編碼步驟,并給給出相應(yīng)的實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2015-06-06
  • Python處理JSON的四大函數(shù)全解析(load/loads/dump/dumps)

    Python處理JSON的四大函數(shù)全解析(load/loads/dump/dumps)

    在現(xiàn)代軟件開發(fā)中,JSON?已成為數(shù)據(jù)交換的通用語言,對于許多初學(xué)者來說,load、loads、dump、dumps?這四個(gè)核心函數(shù)似乎總是有點(diǎn)令人困惑,下面小編就為大家詳細(xì)介紹一下吧
    2025-10-10

最新評論

本溪市| 靖安县| 醴陵市| 娄烦县| 渑池县| 莎车县| 凤山市| 萝北县| 芦溪县| 屏东市| 高邮市| 武夷山市| 洱源县| 新干县| 六安市| 萝北县| 崇信县| 博乐市| 和平区| 凤庆县| 厦门市| 枣阳市| 资兴市| 防城港市| 剑阁县| 若羌县| 江都市| 刚察县| 沙雅县| 礼泉县| 大足县| 马鞍山市| 苍溪县| 阿瓦提县| 同心县| 会同县| 平湖市| 河源市| 内丘县| 龙江县| 徐汇区|