Python淺談-Python操作資料庫之MySQL(1)
一、SQL:
關系型資料庫,是指采用了關系模型來組織資料的資料庫,其以行和列的形式存盤資料,以便于用戶理解,關系型資料庫這一系列的行和列被稱為表,一組表組成了資料庫,用戶通過查詢來檢索資料庫中的資料,而查詢是一個用于限
定資料庫中某些區域的執行代碼,關系模型可以簡單理解為二維表格模型,而一個關系型資料庫就是由二維表及其之間的關系組成的一個資料組織;
常見的關系型資料庫有:Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL等,
二、MySQL簡介:
MySQL是一個關系型資料庫管理系統,由瑞典MySQLAB公司開發,屬于Oracle旗下產品,MySQL 是最流行的關系型資料庫管理系統之一,在 WEB 應用方面,MySQL是最好的 RDBMS(Relational Database Management System,
關系資料庫管理系統) 應用軟體之一;
MySQL所使用的 SQL(Structured Query Language,是1974年由Boyce和Chamberlin提出的一種介于關系代數與關系演算之間的結構化查詢語言,是一個通用的、功能極強的關系性資料庫語言,) 語言是用于訪問資料庫的最常用標準
化語言,MySQL 軟體采用了雙授權政策,分為社區版和商業版,由于其體積小、速度快、總體擁有成本低,尤其是開放原始碼這一特點,一般中小型網站的開發都選擇 MySQL 作為網站資料庫;
三、MySQL的安裝與使用:
可以使用的版本有MySQL社區版本和MariaDB兩個版本,MySQL下載的地址為 https://dev.mysql.com/downloads/mysql/,MariaDB下載的地址為 https://downloads.mariadb.org/ ,選擇合適的版本下載安裝即可;
關于MariaDB與MySQL的關系可以參考 https://baike.baidu.com/item/mariaDB/6466119?fr=aladdin;
四、MySQL運行的原理:
1.存盤引擎?
對表中資料的讀取和寫入的程式,默認為InnoDB(其他MyISAM、Memory),將表中的資料存盤到磁盤;
以頁作為磁盤和記憶體之間互動的基本單位,InnoDB中頁的大小一般為16KB;
一次最少把記憶體中的16KB內容重繪到磁盤中,每一行都有固定的格式;

圖 1 資料引擎所處的位置
2.事務的概念:
<1>.什么是事務:
操作資料庫從讀取到寫入的整個流程,一組原子性的sql查詢, 或者說一個獨立的作業單元,
<2>.事務的特性:
原子性 Atomic
一致性 Consistency
隔離性 Isolation
持久性 Durable
五、使用Python操作MySQL資料庫——SQLAIchemy:
1.SQLAIchemy?
Python SQL工具包和物件關系映射器;
SQLAlchemy是Python SQL工具包和物件關系映射器,它為應用程式開發人員 提供了SQL的全部功能和靈活性 ;
它提供了一套眾所周知的企業級持久性模式, 專為高效和高性能的資料庫訪問而設計 ,適用于簡單且Python化的領域語言;
作者:Mike Bayer 博客:https://techspot.zzzeek.org/
2.SQLAIchemy的使用思路(主要函式介紹):
declarative_base() ->創建基類
class -> 資料類 ->Table
create_engine -> 資料庫引擎連接資料庫
session -> 創建會話,類似事務
object -> 創建資料對
query -> 各種查詢操作
3.Python操作:
下面是一個以主機和管理員多對多關系的一個簡單的案例:
pip install SQLAIchemy # 安裝庫
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:catt1e
from sqlalchemy import create_engine, Column ,Integer ,String, ForeignKey
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import and_
from sqlalchemy import or_
Base = declarative_base()
class Admin(Base):
'''定義Admin表以及表的欄位名'''
__tablename__= 'admin'
id = Column('id', Integer, primary_key=True)
name = Column('name', String(50), unique=True)
hosts = relationship(
'Host',
secondary='admin_host'
)
def __repr__(self):
return self.name
class Host(Base):
'''定義Host表以及表的欄位名'''
__tablename__= 'host'
id = Column('id', Integer, primary_key=True)
name = Column('name', String(50), unique=True, nullable=False)
admins = relationship(
'Admin',
secondary='admin_host'
)
def __repr__(self):
return self.name
class AdminHost(Base):
'''定義AdminHost表以及表的欄位名'''
__tablename__ = 'admin_host'
admin_id = Column(Integer, ForeignKey('admin.id'), primary_key=True)
host_id = Column(Integer, ForeignKey('host.id'), primary_key=True)
# engine = create_engine('mysql+pymysql://username:password@localhost/db')
engine = create_engine('mysql+pymysql://root:Pwdfordb826@localhost/catt1e?charset=utf8') # 引擎
Base.metadata.create_all(bind=engine) # 創建資料庫,注意第一次創建完成后要注釋,否則進行資料庫操作會報錯
# session
DBSession = sessionmaker(bind=engine) # 類
session = DBSession() # 實體
def add_admin(session, id, name):
'''添加管理員'''
s = Admin()
s.id = id
s.name = name
session.add(s)
return s
def main():
# 增加資料
# admin = add_admin(session, 4, 'admin_catt1e')
# h1 = Host(id=1100, name='webweb.server')
# h2 = Host(id=2200, name='dbdb.server')
# h3 = Host(id=3300, name='devdev.server')
# admin.hosts.append(h1)
# admin.hosts.append(h2)
# admin.hosts.append(h3)
# session.add(admin)
# session.commit()
# 查詢資料
print('all: ', session.query(Admin).all())
print('admin catt1e: ', session.query(Admin).filter(Admin.name.endswith('catt1e')).one())
print('admin catt1e hosts: ', session.query(Admin).filter(Admin.name.endswith('catt1e')).one().hosts)
print('dbdb.server的管理員是誰,從用戶表里開始查: ', session.query(Admin).filter(Admin.hosts.any(Host.name=='dbdb.server')).all())
if __name__ == '__main__':
main()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/165928.html
標籤:Python
