相關內容: 使用pymysql直接操作mysql 創建表 查看表 修改表 刪除表 插入數據 查看數據 修改數據 刪除數據 使用sqlmary操作mysql 創建表 查看表 修改表 刪除表 插入數據 查看數據 修改數據 刪除數據 首發時間:2018-02-24 23:59 【第一次寫那麼長的博文,若有... ...
相關內容:
- 使用pymysql直接操作mysql
- 創建表
- 查看表
- 修改表
- 刪除表
- 插入數據
- 查看數據
- 修改數據
- 刪除數據
- 使用sqlmary操作mysql
- 創建表
- 查看表
- 修改表
- 刪除表
- 插入數據
- 查看數據
- 修改數據
- 刪除數據
首發時間:2018-02-24 23:59
【第一次寫那麼長的博文,若有錯誤,請不吝與我說明】
直接操作mysql:
前提:
- 首先需要安裝python與mysql交互的庫【PyMySQL 是在 Python3 版本中用於連接 MySQL 伺服器的一個庫】:
- 安裝模塊:pymysql:
pip3 install pymysql
或者在Pycharm中安裝
- 安裝模塊:pymysql:
使用:
- 首先導入模塊:import pymysql
- 連接資料庫 :資料庫連接對象 = pymysql.connect("host="localhost",port=3306,user='root',passwd='123456',db='python_test') 【如果需要支持中文,則加上charset=”utf8”】
- 創建游標【游標用於執行sql語句和管理查詢到的結果】 :游標對象 = 資料庫連接對象.cursor()
- 執行sql語句 :游標對象.execute(SQL語句) ,返回值是受影響行數
- 獲取結果:
- 關閉游標: 游標對象.close()
- 關閉資料庫連接:資料庫連接對象.close()
示例:
1.創建連接:
import pymysql #創建連接 conn=pymysql.connect(host="localhost",port=3306,user="root",passwd="123456",db="python_test") #創建游標 cursor=conn.cursor() #..............操作過程 #關閉游標 cursor.close() #關閉連接 conn.close()
2.執行查詢:
import pymysql #創建連接 conn=pymysql.connect(host="localhost",port=3306,user="root",passwd="123456",db="python_test",charset="utf8") #創建游標 cursor=conn.cursor() cursor.execute("select * from student;") print(cursor.fetchone())#獲取一條 print(cursor.fetchmany(2))#獲取兩條 print(cursor.fetchall())#獲取結果集合中的全部 #關閉游標 cursor.close() #關閉連接 conn.close()
3.執行插入、修改、刪除:
import pymysql #創建連接 conn=pymysql.connect(host="localhost",port=3306,user="root",password="123456",db="python_test",charset="utf8") #創建游標 cursor=conn.cursor() print("-----------插入----------------") cursor.execute("insert into student values ('nazha',2000,'男');") cursor.execute("select * from student;") print(cursor.fetchall()) print("-----------插入----------------") #cursor.executemany(self,query,args) cursor.executemany("insert into student value(%s,%s,%s);",[('zhangsan',18,'男'),('lisi',18,'男')]) cursor.execute("select * from student;") print(cursor.fetchall()) print("-----------修改----------------") cursor.execute("update student set name = 'zhangsan1' where name = 'zhangsan';") cursor.execute("select * from student;") print(cursor.fetchall()) print("----------刪除-----------------") cursor.execute("delete from student where name = 'lisi';") cursor.execute("select * from student;") print(cursor.fetchall()) print("---------------------------") #需要提交才能插入、成功修改、刪除 conn.commit() #關閉游標 cursor.close() #關閉連接 conn.close()
結果:
(('lilei', 18, '男'), ('hanmeimei', 18, '女'), ('huluwa', 18, '男'), ('sunwukong', 18, '男'), ('baigujing', 3000, '女'), ('nazha', 2000, '男')) --------------------------- (('lilei', 18, '男'), ('hanmeimei', 18, '女'), ('huluwa', 18, '男'), ('sunwukong', 18, '男'), ('baigujing', 3000, '女'), ('nazha', 2000, '男'), ('zhangsan', 18, '男'), ('lisi', 18, '男')) --------------------------- (('lilei', 18, '男'), ('hanmeimei', 18, '女'), ('huluwa', 18, '男'), ('sunwukong', 18, '男'), ('baigujing', 3000, '女'), ('nazha', 2000, '男'), ('zhangsan1', 18, '男'), ('lisi', 18, '男')) --------------------------- (('lilei', 18, '男'), ('hanmeimei', 18, '女'), ('huluwa', 18, '男'), ('sunwukong', 18, '男'), ('baigujing', 3000, '女'), ('nazha', 2000, '男'), ('zhangsan1', 18, '男')) ---------------------------
4.設置支持中文【添加charset=”utf8”】:
import pymysql #創建連接 # conn=pymysql.connect(host="localhost",port=3306,user='root',passwd='123456',db='python_test') conn=pymysql.connect(host="localhost",port=3306,user='root',passwd='123456',db='python_test',charset="utf8") #創建游標 cursor = conn.cursor() effect_row= cursor.execute("select * from student;") print("執行成功,受影響行數:",effect_row) print(cursor.fetchall()) conn.commit() cursor.close() conn.close()
添加前:
添加後:
使用sqlalchemy操作mysql:
介紹:
- ORM 將資料庫中的表與面向對象語言中的類建立了一種對應關係,【ORM可以說是參照映射來處理數據的模型,比如說:需要創建一個表,可以定義一個類,而這個類存在與表相映射的屬性,那麼可以通過操作這個類來創建一個表】
- sqlmary是一個mysql的ORM
前提:
- 安裝模塊:pip3 install sqlalchemy
使用:
- 導入模塊:
- 導入連接資料庫模塊:from sqlalchemy import create_engine
- 如果需要創建新表,則需要導入表結構定義模塊:from sqlalchemy.ext.declarative import declarative_base
- 導入其他相關模塊,主要是映射的類,如欄位映射為Column,如數據類型int映射為Integer,如索引映射為Index,需要什麼導入什麼:from sqlalchemy import Column,Integer,String
- 映射關係:
資料庫中 映射 模塊【如果可以從多個模塊處導入,用 | 分隔】【方式太多,可能有漏,但不影響導入】 表 Table from sqlalchemy import Table int Integer from sqlalchemy.types import Integer 索引 Index from sqlalchemy import Index 欄位、列 Column from sqlalchemy import Column varchar VARCHAR、String from sqlalchemy.types import String | from sqlalchemy import String 外鍵 ForeignKey from sqlalchemy import ForeignKey
- 連接資料庫:連接對象=create_engine('資料庫類型+資料庫驅動名稱://用戶名:口令@機器地址:埠號/資料庫名',編碼格式,echo)
- sqlalchemy支持多種API操作模式,可以使用不同的模式來連接操作資料庫:'資料庫類型+資料庫驅動名稱://用戶名:口令@機器地址:埠號/資料庫名'
- 比如pymsql【py3常用】:
mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>
- 比如pymsql【py3常用】:
- 其他參數:
- echo是否顯示ORM轉成實際sql語句的過程,echo=True為顯
encoding為連接時使用的字元集
- sqlalchemy支持多種API操作模式,可以使用不同的模式來連接操作資料庫:'資料庫類型+資料庫驅動名稱://用戶名:口令@機器地址:埠號/資料庫名'
操作:
基本操作:
- 創建新表
- 方法一: 使用declarative
- 1.導入模塊
from sqlalchemy.ext.declarative import declarative_base
2.根據需要的元素來導入模塊
from sqlalchemy import Column
導入需要的數據類型【註:數據類型在sqlalchemy中也有指向,所以也可以
from sqlalchemy.types import *from sqlalchemy import String,Integer,Char
】:
3.創建連接,
3.使用declarative_base來獲得一個類對象,此處我定義該對象為Base
定義一個類,繼承declarative_base生成的類對象Base
使用__tablename__來定義表名
使用 列名 = Column(數據類型,其他列屬性…)等類似格式來定義欄位
nullable=False
代表這一列不可以為空,index=True
表示在該列創建索創建表:
Base.metadata.create_all(engine)from sqlalchemy import create_engine#負責導入連接資料庫的對象 from sqlalchemy.ext.declarative import declarative_base#負責導入創建表的api from sqlalchemy import Column #負責導入列 from sqlalchemy.types import *#負責導入列類型 #資料庫連接 engine = create_engine("mysql+pymysql://root:123456@localhost/python_test",encoding ='utf-8',echo=True) #方式一: Base = declarative_base() class User(Base): __tablename__ = 'user'#表名 id = Column(Integer,primary_key=True) name = Column(String(32)) password = Column(String(64)) Base.metadata.create_all(engine)
- 方法二:使用Table
- 1.導入模塊: from sqlalchemy import Table
- 2.連接資料庫:engine=create_engine(….)
- 3.獲取meta類,metadata=MetaData(engine)
- 4.創建Table對象( 比如:t=Table("group" ,metadata,Column("id",Integer,primary_key=True),Column("group_name",String(32))) )
- 5.創建表:metadata.create_all()
from sqlalchemy import create_engine from sqlalchemy import Table from sqlalchemy import MetaData from sqlalchemy import Column from sqlalchemy.types import * from sqlalchemy.ext.declarative import declarative_base ####下麵的註釋部分可以與上面一句的未註釋的替換 engine=create_engine("mysql+pymysql://root:123456@localhost/python_test",encoding ='utf-8',echo=True) metadata=MetaData(engine) ### # Base=declarative_base() t=Table( "group" ,metadata,#表名 # "group",Base.metadata, Column("id",Integer,primary_key=True), Column("group_name",String(32)) ) metadata.create_all() # Base.metadata.create_all(engine)
- 查看表:
- db_table=Base.metadata.tables#僅有當次運行中繼承了Base而創建的新表
- db_tables=engine.table_names()#僅有表名
- 刪除表:
Base.metadata.drop_all(engine)
- 修改表:
- 直接修改表所對應的類結構是無法修改成功的,
- 如果需要修改在程式中自定義的表的結構,那麼需要手動修改,手動的方式有很多,比如直接engine.execute(sql語句)。。。。
- 插入 數據【這裡僅針對使用declarative_base創建的表,對於不是程式中才創建的,可以自己使用declarative_base建一個類來映射之前的表,只要映射一致,就能插入數據】
- 1.連接資料庫:engine=create_engine(….)
- 1.導入模塊:from sqlalchemy.orm import sessionmaker
- 2.獲取session_class類:Session_class=sessionmaker(bind=engine)
- 3.獲取session對象:s=Session_class()
- 4.使用s來添加:
- s.add()
- s.add_all()
- 5.提交數據: s.commit()
from sqlalchemy import create_engine#負責導入連接資料庫的對象 from sqlalchemy.ext.declarative import declarative_base#負責導入創建表的api from sqlalchemy import Column #負責導入列 from sqlalchemy.types import *#負責導入列類型 #資料庫連接 engine = create_engine("mysql+pymysql://root:123456@localhost/python_test",encoding ='utf-8',echo=True) Base = declarative_base() class User(Base): __tablename__ = 'user'#表名 id = Column(Integer,primary_key=True) name = Column(String(32)) password = Column(String(64)) group = Column(Integer) Base.metadata.create_all(engine) from sqlalchemy.orm import sessionmaker obj1=User(name='lisi',password='123456',group=1) Session=sessionmaker(bind=engine) s=Session() s.add(obj1)# users=[User(name='wangwu',password='123456',group=1), User(name='zhaoliu', password='123456', group=1), User(name='sunqi', password='123456', group=1) ] s.add_all(users)# s.commit()
- 查找 數據
同樣適用sessionmaker來查找,與插入相同,需要創建session_class對象(我定義為s)
使用s來查找:
- s.query(表對應類)是相當於select對應表,後面可以跟first()、all()等來獲取結果,也可以加filter、filter_by等來篩選結果
獲取全部
: s.query(表對應類).all() 【返回的是一個結果列表】查找指定: s.query(表對應類).filter(表對應類.xxx==xxxx)【filter獲取的是結果集,需要使用all(),first()等方法來獲取結果】
查找指定: s.query(表對應類).filter_by(xxx=xxxx)
附:雖然返回值是一個結果集,但這個集合是一個類對象,如果想查看內容,需要在表對應的類中增加__repr__方法。
多個篩選條件使用“,”隔開
常見可用篩選條件【User是一個表對應的類】:
使用filter,filter_by時: User.name==’lisi’
User.name.like(“lisi%”))
User.name != ’lisi’
User.name.any() or_(篩選條件) 【代表裡面的多個篩選條件以or組合,需要導入:from sqlalchemy import or_】 and_(篩選條件) 【代表裡面的多個篩選條件以and組合,需要導入:from sqlalchemy import and_】【預設是and】 in_([篩選條件]) 【使用比如User.name.in_(['xiaxia', 'lilei', 'lover'])】 使用all時,以下是放在query裡面的: User.name [這相當於不使用where的select name from 表] 連接查詢使用:s.query(表對應類).join(表對應類.xxx==xxxx)
還有group_by,order_by等用法這裡不做講解[什麼時候有空再補吧!]
from sqlalchemy import create_engine#負責導入連接資料庫的對象 from sqlalchemy.ext.declarative import declarative_base#負責導入創建表的api from sqlalchemy import Column #負責導入列 from sqlalchemy.types import *#負責導入列類型 #資料庫連接 engine = create_engine("mysql+pymysql://root:123456@localhost/python_test",encoding ='utf-8') Base = declarative_base() class User(Base): __tablename__ = 'user'#表名 id = Column(Integer,primary_key=True) name = Column(String(32)) password = Column(String(64)) group = Column(Integer) def __repr__(self): return "<id:%s name:%s group:%s>"%(self.id,self.name,self.group) Base.metadata.create_all(engine) from sqlalchemy.orm import sessionmaker obj1=User(name='lisi',password='123456',group=1) Session=sessionmaker(bind=engine) s=Session() a=s.query(User).all() a2=s.query(User).filter(User.name=='lisi').first() a3=s.query(User).filter_by(name='lisi').first() print(a) print(a2) print(a3)
- 修改 數據:
- 修改數據的基礎是先查找到數據,查找:row=s.query(X).filter(X.xxx=xxx).first()
- 使用賦值語句修改 :row.xxx=xxxx
from sqlalchemy import create_engine#負責導入連接資料庫的對象 from sqlalchemy.ext.declarative import declarative_base#負責導入創建表的api from sqlalchemy import Column #負責導入列 from sqlalchemy.types import *#負責導入列類型 #資料庫連接 engine = create_engine("mysql+pymysql://root:123456@localhost/python_test",encoding ='utf-8') Base = declarative_base() class User(Base): __tablename__ = 'user'#表名 id = Column(Integer,primary_key=True) name = Column(String(32)) password = Column(String(64)) group = Column(Integer) def __repr__(self): return "<id:%s name:%s group:%s>"%(self.id,self.name,self.group) Base.metadata.create_all(engine) from sqlalchemy.orm import sessionmaker obj1=User(name='lisi',password='123456',group=1) Session=sessionmaker(bind=engine) s=Session() row=s.query(User).filter(User.name=='lisi').first() row.name='lisi2' s.commit()
- 刪除 數據:
- 刪除數據的基礎是先查找到數據,查找:row=s.query(X).filter(X.xxx=xxx)
- 使用delete刪除:row.delete()
# coding: utf-8 from sqlalchemy import create_engine#負責導入連接資料庫的對象 from sqlalchemy.ext.declarative import declarative_base#負責導入創建表的api from sqlalchemy import Column #負責導入列 from sqlalchemy.types import *#負責導入列類型 #資料庫連接 engine = create_engine("mysql+pymysql://root:123456@localhost/python_test",encoding ='utf-8') Base = declarative_base() class User(Base): __tablename__ = 'user'#表名 id = Column(Integer,primary_key=True) name = Column(String(32)) password = Column(String(64)) group = Column(Integer) def __repr__(self): return "<id:%s name:%s group:%s>"%(self.id,self.name,self.group) Base.metadata.create_all(engine) from sqlalchemy.orm import sessionmaker obj1=User(name='lisi',password='123456',group=1) Session=sessionmaker(bind=engine) s=Session() a3=s.query(User).filter_by(name='lisi1') a3.delete() s.commit()
- 外鍵相關:
- 外鍵使用foregin_key創建
- 類中的relationship的作用:幫助ORM獲知他們的外鍵關係,以便ORM使用外鍵獲取相關數據
- relationship中的backref的用途:relationship使得可以在一個表中定義的relationshop能被兩個表使用,另一個表使用backref來獲取相關信息
- relationship中的foreign_keys的用途:當有多個relationship時,為了避免ORM混淆多個relationship,特別的標註哪個外鍵是哪個relationship
- relationship中的secondary的用途:在多對多的關係中,填入的值是中間表,維持兩邊表關係。
- 一對一的外鍵關係:
- 1.導入模塊:from sqlalchemy import Foreign_key
- 2.建立外鍵(如:group = Column(Integer,ForeignKey("group.id")),建立關係(如:group_relation=relationship('Group',backref="g_users")
- 3.插入數據
- 4.查詢到一條數據:如row=s.query(User).filter(User.name=='lisi').first()
- 5.嘗試A表調用關係來獲取B(row.group_relation.group_name),B使用backref來獲取A的數據(row2.g_users)
- 下麵的實例大概就是“一個開發人員對應一個開發組的關係”
#負責導入連接資料庫的對象 from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base#負責導入創建表的api from sqlalchemy import Column,ForeignKey #負責導入列 from sqlalchemy.types import *#負責導入列類型 from sqlalchemy.orm import relationship #資料庫連接 engine = create_engine("mysql+pymysql://root:123456@localhost/python_test",encoding ='utf-8') Base = declarative_base() class Group(Base): __tablename__="group" id=Column(Integer,primary_key=True) group_name=Column(String(32),nullable=False) def __repr__(self): return "<id:%s group_name:%s>"%(self.id,self.group_name) class User(Base): __tablename__ = 'user'#表名 id = Column(Integer,primary_key=True) name = Column(String(32),nullable=False) password = Column(String(64),nullable=False) group = Column(Integer,ForeignKey("group.id"))#這裡創建外鍵 group_relation=relationship('Group',backref="g_users")#為ORM指明關係,方便ORM處理,第一個是對應的類 def __repr__(self): return "<id:%s name:%s>"%(self.id,self.name) Base.metadata.create_all(engine) from sqlalchemy.orm import sessionmaker # group1=Group(group_name='python') # group2=Group(group_name='linux') # group3=Group(group_name='AI') # user1=User(name='lisi',password='123456',group=1) # user2=User(name='zhangsan',password='123456',group=2) # user3=User(name='wangwu',password='123456',group=3) # user4=User(name='lilei',password='123456',group=3) Session=sessionmaker(bind=engine) s=Session() # s.add_all([group1,group2,group3,user1,user2,user3,user4]) # s.commit() # row=s.query(User).filter(User.name=='lisi').first() row=s.query(User).first() print(row.group_relation.group_name)#這裡User通過關係來獲取Group的數據 row2=s.query(Group).first() print(row2) print(row2.g_users)#這裡Group通過relationship的backref來獲取User的數據
- 一對多關係,外鍵關聯
以一個老師能做一個班的班主任此外還能做另一個班的副班主任為例【即一個老師能對應多個班級】
- 一對多關係的創建的核心是relationship中的foreign_keys
附:當你建表成功而插入數據失敗時,可以嘗試先刪除掉數據表,有時候因為外鍵依賴會導致插入失敗
#負責導入連接資料庫的對象 from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base#負責導入創建表的api from sqlalchemy import Column,ForeignKey #負責導入列 from sqlalchemy.types import *#負責導入列類型 from sqlalchemy.orm import relationship #資料庫連接 engine = create_engine("mysql+pymysql://root:123456@localhost/python_test",encoding ='utf-8') Base = declarative_base() class Grade(Base): __tablename__="grade" id=Column(Integer,primary_key=True) grade_name=Column(String(32),nullable=False) def __repr__(self): return "<id:%s group_name:%s>"%(self.id,self.grade_name) class Teacher(Base): __tablename__ = 'teacher'#表名 id = Column(Integer,primary_key=True) name = Column(String(32),nullable=False) primary_grade = Column(Integer,ForeignKey("grade.id")) seco