Python操作資料庫基本操作-sqlalchemy
阿新 • • 發佈:2021-10-10
Python、MySQL、資料庫、資料庫連線、插入資料、批量插入資料
使用sqlalchemy,不僅要安裝sqlalchemy庫,還要安裝pymysql
連線資料庫很簡單,使用一行簡短的程式即可
from sqlalchemy import create_engine import pandas as pd def sqlalchemy_test(): ENGINE = create_engine("mysql+pymysql://root:[email protected]:3306/asoul") # 查詢2021年9月30日之後的所有item sql = """ select iditem,itemname,performtime from item where performtime>'2021-9-30' order by performtime desc""" df = pd.read_sql(sql, ENGINE) print(df) if __name__ == '__main__': sqlalchemy_test()
然後就查詢成功,列印資料框,也可以換成自己的查詢語句進行資料庫連線測試。
關鍵的是插入資料,這裡有如下的資料表
一個int型別自增主鍵,一個DATETIME型別的日期,其他四個String型別
有如下資料:
該資料有三列,分別對應category、itemname、performtime,其中performtime有一些空欄位。
現在目標是將一下資料插入到上述表item中。
首先,在python檔案中定義表Item的對映(建立表):格式如下
from sqlalchemy import create_engine from sqlalchemy import Column from sqlalchemy import Integer, String, DateTime from sqlalchemy.ext.declarative import declarative_bas import pandas as pd Base = declarative_base() class Item(Base): __tablename__ = 'item' iditem = Column(Integer, primary_key=True) category= Column(String(32)) itemname = Column(String(64)) idolname = Column(String(16)) performtime = Column(DateTime) linkurl = Column(String(128)) def __repr__(self): return "<Item(category='%s', itemname='%s', idolname='%s', performtime='%s)>" % \ self.category, self.itemname, self.idolname, self.performtime
一、插入單條資料
建立資料庫連線,根據連線初始化Session的引數,然後建立session物件,用session來進行資料記錄的插入,最後提交此次操作:
from sqlalchemy import create_engine from sqlalchemy import Column from sqlalchemy import Integer, String, DateTime from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker import pandas as pd Base = declarative_base() class Item(Base): __tablename__ = 'item' iditem = Column(Integer, primary_key=True) category = Column(String(32)) itemname = Column(String(64)) idolname = Column(String(16)) performtime = Column(DateTime) linkurl = Column(String(128))def insert_into_table(): ENGINE = create_engine("mysql+pymysql://root:[email protected]:3306/asoul") Base.metadata.create_all(ENGINE) Session = sessionmaker(bind=ENGINE) session = Session() session.add(Item(category="歌", itemname="胡廣生", idolname="珈樂Carol", performtime=None)) session.add(Item(category="歌", itemname="七里香", idolname="珈樂Carol", performtime="2021-2-14")) session.commit() if __name__ == '__main__': insert_into_table()
這裡插入的兩條記錄,
1. 缺省了自增主鍵,這個會根據資料庫的自增主鍵欄位,自動設定主鍵
2. 缺省了linkurl欄位,這個會在資料庫自動設定為NULL
3. 其中一條記錄的performtime欄位設定為None,這個會自動在資料庫設定為NULL
結果如下:
二、批量插入記錄
讀取檔案,將每一行資料建立為一個Item物件。然後呼叫session的add_all函式一次性全部插入資料庫,對於空欄位需要進行判斷
from sqlalchemy import create_engine from sqlalchemy import Column from sqlalchemy import Integer, String, DateTime from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker Base = declarative_base() class Item(Base): __tablename__ = 'item' iditem = Column(Integer, primary_key=True) category = Column(String(32)) itemname = Column(String(64)) idolname = Column(String(16)) performtime = Column(DateTime) linkurl = Column(String(128)) def insert_into_table(): # 將資料的每一行建立為一個Item物件 data = [] with open("temp.csv", encoding='utf-8') as file: line = file.readline() while line: line_s = line.strip("\n").split(',') if line_s[2] == '': data.append(Item(category=line_s[0], itemname=line_s[1], idolname="珈樂Carol")) else: data.append(Item(category=line_s[0], itemname=line_s[1], idolname="珈樂Carol", performtime=line_s[2])) line = file.readline() # 建立連線,建立session,提交資料 ENGINE = create_engine("mysql+pymysql://root:[email protected]:3306/asoul") Base.metadata.create_all(ENGINE) Session = sessionmaker(bind=ENGINE) session = Session() session.add_all(data) session.commit() if __name__ == '__main__': insert_into_table()
結果如下: