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

Pandas直接讀取sql腳本的方法

 更新時間:2021年01月21日 11:01:28   作者:小小明(代碼實體)  
這篇文章主要介紹了Pandas直接讀取sql腳本的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

之前有群友反應同事給了他一個幾百MB的sql腳本,導入數(shù)據(jù)庫再從數(shù)據(jù)庫讀取數(shù)據(jù)有點慢,想了解下有沒有可以直接讀取sql腳本到pandas的方法。

解析sql腳本文本文件替換成csv格式并加載

我考慮了一下sql腳本也就只是一個文本文件而已,而且只有幾百MB,現(xiàn)代的機器足以把它一次性全部加載到內存中,使用python來處理也不會太慢。

我簡單研究了一下sql腳本的導出格式,并根據(jù)格式寫出了以下sql腳本的讀取方法。

注意:該讀取方法只針對SQLyog導出的mysql腳本測試,其他數(shù)據(jù)庫可能代碼需要根據(jù)實際情況微調。

讀取方法:

from io import StringIO
import pandas as pd
import re

def read_sql_script_all(sql_file_path, quotechar="'") -> (str, dict):
  insert_check = re.compile(r"insert +into +`?(\w+?)`?\(", re.I | re.A)
  with open(sql_file_path, encoding="utf-8") as f:
    sql_txt = f.read()
  end_pos = -1
  df_dict = {}
  while True:
    match_obj = insert_check.search(sql_txt, end_pos+1)
    if not match_obj:
      break
    table_name = match_obj.group(1)
    start_pos = match_obj.span()[1]+1
    end_pos = sql_txt.find(";", start_pos)
    tmp = re.sub(r"\)( values |,)\(", "\n", sql_txt[start_pos:end_pos])
    tmp = re.sub(r"[`()]", "", tmp)
    df = pd.read_csv(StringIO(tmp), quotechar=quotechar)
    dfs = df_dict.setdefault(table_name, [])
    dfs.append(df)
  for table_name, dfs in df_dict.items():
    df_dict[table_name] = pd.concat(dfs)
  return df_dict

參數(shù):

  • sql_file_path:sql腳本的位置
  • quotechar:腳本中字符串是單引號還是雙引號,默認使用單引號解析

返回:

一個字典,鍵是表名,值是該表對應的數(shù)據(jù)所組成的datafream對象

下面我測試讀取下面這個sql腳本:

image-20210119212414433

其中的表名是index_test

df_dict = read_sql_script_all("D:/tmp/test.sql")
df = df_dict['index_test']
df.head(10)

結果:

image-20210119212546592

可以看到能順利的直接從sql腳本中讀取數(shù)據(jù)生成datafream。

當然上面寫的方法是一次性讀取整個sql腳本的所有表,結果為一個字典(鍵為表名,值為datafream)。但大部分時候我們只需要讀取sql腳本的某一張表,我們可以改造一下上面的方法:

def read_sql_script_by_tablename(sql_file_path, table_name, quotechar="'") -> (str, dict):
  insert_check = re.compile(r"insert +into +`?(\w+?)`?\(", re.I | re.A)
  with open(sql_file_path, encoding="utf-8") as f:
    sql_txt = f.read()
  end_pos = -1
  dfs = []
  while True:
    match_obj = insert_check.search(sql_txt, end_pos+1)
    if not match_obj:
      break
    start_pos = match_obj.span()[1]+1
    end_pos = sql_txt.find(";", start_pos)
    if table_name != match_obj.group(1):
      continue
    tmp = re.sub(r"\)( values |,)\(", "\n", sql_txt[start_pos:end_pos])
    tmp = re.sub(r"[`()]", "", tmp)
    df = pd.read_csv(StringIO(tmp), quotechar=quotechar)
    dfs.append(df)
  return pd.concat(dfs)

參數(shù):

  • sql_file_path:sql腳本的位置
  • table_name:被讀取的表名
  • quotechar:腳本中字符串是單引號還是雙引號,默認使用單引號解析

返回:

該表所對應的datafream對象

讀取代碼:

df = read_sql_script_by_tablename("D:/tmp/test.sql", "index_test")
df.head()

結果:

image-20210119222939611

將sql腳本轉換為sqlite格式并通過本地sql連接讀取

在寫完上面的方法后,我又想到另一種解決思路,就是將sql腳本轉換成sqlite語法的sql語句,然后直接加載。各種類型的數(shù)據(jù)庫的sql語句變化較大,下面的方法僅針對SQLyog導出的mysql腳本測試通過,如果是其他的數(shù)據(jù)庫,可能下面的方法仍然需要微調。最好是先自行將sql腳本轉換為sqlite語法的sql語句后,再使用我寫的方法加載。

加載sql腳本的方法:

from sqlalchemy import create_engine
import pandas as pd
import re


def load_sql2sqlite_conn(sqltxt_path):
  create_rule = re.compile("create +table [^;]+;", re.I)
  insert_rule = re.compile("insert +into [^;]+;", re.I)
  with open(sqltxt_path, encoding="utf-8") as f:
    sqltxt = f.read()
  engine = create_engine('sqlite:///:memory:')
  pos = -1
  while True:
    match_obj = create_rule.search(sqltxt, pos+1)
    if match_obj:
      pos = match_obj.span()[1]
      sql = match_obj.group(0).replace("AUTO_INCREMENT", "")
      sql = re.sub("\).+;", ");", sql)
      engine.execute(sql)
    match_obj = insert_rule.search(sqltxt, pos+1)
    if match_obj:
      pos = match_obj.span()[1]
      sql = match_obj.group(0)
      engine.execute(sql)
    else:
      break
  tablenames = [t[0] for t in engine.execute(
    "SELECT tbl_name FROM sqlite_master WHERE type='table';").fetchall()]
  return tablenames, engine.connect()

參數(shù):

sql_file_path:sql腳本的位置

返回:

兩個元素的元組,第一個元素是表名列表,第二個元素是sqlite內存虛擬連接

測試讀取:

tablenames, conn = load_sql2sqlite_conn("D:/tmp/test.sql")
tablename = tablenames[0]
print(tablename)
df = pd.read_sql(f"select * from {tablename};", conn)
df

結果:

image-20210119234403297

到此這篇關于Pandas直接讀取sql腳本的文章就介紹到這了,更多相關Pandas讀取sql腳本內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 將Python項目打包成exe并附帶下載功能的操作流程

    將Python項目打包成exe并附帶下載功能的操作流程

    這篇文章主要為大家詳細介紹了將Python項目打包成exe并附帶下載功能的操作流程,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以了解下
    2023-12-12
  • python中K-means算法基礎知識點

    python中K-means算法基礎知識點

    在本篇文章里小編給大家整理的是一篇關于python中K-means算法基礎知識點內容,有興趣的朋友們可以學習參考下。
    2021-01-01
  • 在python中實現(xiàn)導入一個需要傳參的模塊

    在python中實現(xiàn)導入一個需要傳參的模塊

    這篇文章主要介紹了在python中實現(xiàn)導入一個需要傳參的模塊,具有很好的參考價值,希望可以給大家一個參考,以后在遇到這種的情況的時候,知道如何應對
    2021-05-05
  • 如何利用Python統(tǒng)計正數(shù)和負數(shù)的個數(shù)

    如何利用Python統(tǒng)計正數(shù)和負數(shù)的個數(shù)

    Python檢查數(shù)據(jù)中的正/負數(shù)是一種常見的數(shù)據(jù)處理操作,可以通過編寫代碼來實現(xiàn),下面這篇文章主要給大家介紹了關于如何利用Python統(tǒng)計正數(shù)和負數(shù)的個數(shù)的相關資料,需要的朋友可以參考下
    2024-05-05
  • python實現(xiàn)貪吃蛇游戲源碼

    python實現(xiàn)貪吃蛇游戲源碼

    這篇文章主要為大家詳細介紹了python實現(xiàn)貪吃蛇游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • Django框架中視圖的用法

    Django框架中視圖的用法

    這篇文章介紹了Django框架中視圖的用法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • ubuntu環(huán)境下python虛擬環(huán)境的安裝過程

    ubuntu環(huán)境下python虛擬環(huán)境的安裝過程

    這篇文章主要介紹了ubuntu環(huán)境下python虛擬環(huán)境的安裝搭建過程 ,需要的朋友可以參考下
    2018-01-01
  • 基于python+selenium的二次封裝的實現(xiàn)

    基于python+selenium的二次封裝的實現(xiàn)

    這篇文章主要介紹了基于python+selenium的二次封裝的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • Python接口測試get請求過程詳解

    Python接口測試get請求過程詳解

    這篇文章主要介紹了python接口測試 get請求過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • Python的Flask站點中集成xhEditor文本編輯器的教程

    Python的Flask站點中集成xhEditor文本編輯器的教程

    xhEditor是基于jQuery的Web端文本編輯器,基本的圖片上傳等功能也都帶有,這里我們就來看一下Python的Flask站點中集成xhEditor文本編輯器的教程
    2016-06-06

最新評論

郧西县| 扎兰屯市| 柳林县| 滁州市| 石河子市| 马尔康县| 三门县| 宁河县| 威海市| 彰化市| 长兴县| 龙里县| 清原| 衢州市| 泌阳县| 武胜县| 久治县| 鄯善县| 延津县| 内乡县| 南部县| 陆河县| 措美县| 石屏县| 略阳县| 四会市| 长垣县| 黄梅县| 宿州市| 观塘区| 峨眉山市| 焦作市| 孟连| 吉安市| 柏乡县| 临沧市| 平顶山市| 丰台区| 侯马市| 平和县| 同德县|