Python 學習筆記17 - 訪問數據庫

使用 SQLite

# 導入SQLite驅動:
import sqlite3

# 連接到SQLite數據庫
# 數據庫文件是test.db
# 如果文件不存在,會自動在當前目錄創建:
conn = sqlite3.connect('test.db')

# 創建一個Cursor
cursor = conn.cursor()

# 執行一條SQL語句,創建user表
cursor.execute('create table user (id varchar(20) primary key, name varchar(20))')
# 繼續執行一條SQL語句,插入一條記錄:
cursor.execute('insert into user (id, name) values (\'1\', \'Michael\')')

# 通過rowcount獲得插入的行數:
cursor.rowcount

# 關閉Cursor:
cursor.close()

# 提交事務:
conn.commit()

# 關閉Connection:
conn.close()

查詢記錄:

conn = sqlite3.connect('test.db')
cursor = conn.cursor()

# 執行查詢語句:
cursor.execute('select * from user where id=?', ('1',))

# 獲得查詢結果集:
values = cursor.fetchall() ==> [('1', 'Michael')]

cursor.close()
conn.close()

使用 Cursor 對象執行 insertupdatedelete 語句時,執行結果由 rowcount 返回影響的行數,就可以拿到執行結果

使用 Cursor 對象執行 select 語句時,通過 featchall() 可以拿到結果集。結果集是一個 list ,每個元素都是一個 tuple ,對應一行記錄

如果 SQL 語句帶有參數,那么需要把參數按照位置傳遞給 execute() 方法,有幾個 ? 占位符就必須對應幾個參數

cursor.execute('select * from user where name=? and pwd=?', ('abc', 'password'))

使用 MySQL

MySQL 官方提供了 mysql-connector-python 驅動,但是安裝的時候需要給 pip 命令加上參數 --allow-external

$ pip install mysql-connector-python --allow-external mysql-connector-python

或者

$ pip install mysql-connector

Note: MySQL 的 SQL 占位符是 %s

# 導入MySQL驅動:
>>> import mysql.connector
# 注意把password設為你的root口令:
>>> conn = mysql.connector.connect(user='root', password='password', database='test')
>>> cursor = conn.cursor()
# 創建user表:
>>> cursor.execute('create table user (id varchar(20) primary key, name varchar(20))')
# 插入一行記錄,注意MySQL的占位符是%s:
>>> cursor.execute('insert into user (id, name) values (%s, %s)', ['1', 'Michael'])
>>> cursor.rowcount
1
# 提交事務:
>>> conn.commit()
>>> cursor.close()
# 運行查詢:
>>> cursor = conn.cursor()
>>> cursor.execute('select * from user where id = %s', ('1',))
>>> values = cursor.fetchall()
>>> values
[('1', 'Michael')]
# 關閉Cursor和Connection:
>>> cursor.close()
True
>>> conn.close()

使用 SQLAlchemy

在 Python 中,最有名的 ORM 框架是 SQLAlchemy

完成SQLAlchemy的初始化和具體每個表的class定義:

# 導入:
from sqlalchemy import Column, String, create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

# 創建對象的基類:
Base = declarative_base()

# 定義User對象:
class User(Base):
    # 表的名字:
    __tablename__ = 'user'

    # 表的結構:
    id = Column(String(20), primary_key=True)
    name = Column(String(20))
    
    
# 初始化數據庫連接 : '數據庫類型+數據庫驅動名稱://用戶名:口令@機器地址:端口號/數據庫名'
engine = create_engine('mysql+mysqlconnector://root:password@localhost:3306/test')

# 創建DBSession類型:
DBSession = sessionmaker(bind=engine)

插入:

# 創建session對象,DBSession對象 session 可視為當前數據庫連接
session = DBSession()

# 創建新User對象:
new_user = User(id='5', name='Bob')

# 添加到session:
session.add(new_user)

# 提交即保存到數據庫:
session.commit()

# 關閉session:
session.close()

查詢:

# 創建Session:
session = DBSession()

# 創建Query查詢,filter是where條件,最后調用one()返回唯一行,如果調用all()則返回所有行:
user = session.query(User).filter(User.id=='5').one()

# 打印類型和對象的name屬性:
print('type:', type(user))
print('name:', user.name)

# 關閉Session:
session.close()

ORM框架也可以提供兩個對象之間的一對多、多對多等功能

定義一對多關系(一個User擁有多個Book):

class User(Base):
    __tablename__ = 'user'

    id = Column(String(20), primary_key=True)
    name = Column(String(20))
    # 一對多:
    books = relationship('Book')

class Book(Base):
    __tablename__ = 'book'

    id = Column(String(20), primary_key=True)
    name = Column(String(20))
    # “多”的一方的book表是通過外鍵關聯到user表的:
    user_id = Column(String(20), ForeignKey('user.id'))

當我們查詢一個User對象時,該對象的books屬性將返回一個包含若干個Book對象的list

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容