介紹一些python中用於連接常用數據庫的依賴庫。
SQLite3
SQLite3是Python 中自帶的數據庫模塊,適用於小型應用和快速原型開發。
SQLite是一個進程內的庫,實現了自給自足的、無服務器的、是非常小的,是輕量級的、事務性的 SQL 數據庫引擎。它是一個零配置的數據庫,不需要在系統中配置。
import sqlite3
# 連接數據庫(新建數據庫)
conn = sqlite3.connect("mydatabase.db")
# 創建表格
cursor = conn.cursor()
cursor.execute("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)")
# 插入數據
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ("Alice", 25))
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ("Bob", 30))
# 查詢數據
cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()
for row in rows: # row是個元組類型
print(row)
# 關閉連接
conn.close()
# 輸出
(1, 'Alice', 25)
(2, 'Bob', 30)
- 連接SQLit
import csv,sqlite3
# 連接數據庫(使用 SQLite3 示例)
conn = sqlite3.connect("mydatabase.db")
cursor = conn.cursor()
# 創建數據表
cursor.execute("CREATE TABLE IF NOT EXISTS books (id INTEGER PRIMARY KEY, title TEXT, author TEXT)")
# 從 CSV 文件中讀取數據
with open("books.csv", "r", encoding='utf-8') as file:
reader = csv.reader(file)
next(reader) # 跳過標題行
for row in reader:
title, author = row
cursor.execute("INSERT INTO books (title, author) VALUES (?, ?)", (title, author))
# 查詢數據
cursor.execute("SELECT * FROM books")
rows = cursor.fetchall()
for row in rows:
print(row)
# 關閉連接
conn.close()
# 輸出
(1, '三體', '劉慈欣')
(2, '吶喊', '魯迅')
mysql-connector
MySQL Connector是用於連接 MySQL 數據庫的官方驅動,適用於中小型應用和生產環境。
- 安裝
pip install mysql-connector-python
- 連接MySQL
# 注意:文件名不要命名爲mysql,不然會掙扎一會。
import mysql.connector
# 連接數據庫
conn = mysql.connector.connect(
host="localhost",
user="root",
password="root",
database="sqllit"
)
# 創建表格
cursor = conn.cursor()
cursor.execute("CREATE TABLE IF NOT EXISTS users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), age INT)")
# 插入數據
cursor.execute("INSERT INTO users (name, age) VALUES (%s, %s)", ("Alice", 25))
cursor.execute("INSERT INTO users (name, age) VALUES (%s, %s)", ("Bob", 30))
# 查詢數據
cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()
for row in rows:
print(row)
# 關閉連接
conn.close()
# 輸出
(1, 'Alice', 25)
(2, 'Bob', 30)
注意,SQLit和MySQL中的cursor.execute
區別:
# SQLit,這裏的?類似於佔位符
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ("Alice", 25))
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ("Bob", 30))
# MySQL
cursor.execute("INSERT INTO users (name, age) VALUES (%s, %s)", ("Alice", 25))
cursor.execute("INSERT INTO users (name, age) VALUES (%s, %s)", ("Bob", 30))
pyodbc
PYODBC爲PYTHON的一個開源程序包,用於通過ODBC連接數據庫。
- 安裝
pip install pyodbc
- 連接Access
import pyodbc
# 連接數據庫(不需要配置數據源),connect()函數創建並返回一個 Connection 對象
cnxn = pyodbc.connect(r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=D:\\work\\test\\sql\\test.mdb')
# cursor()使用該連接創建(並返回)一個遊標或類遊標的對象
crsr = cnxn.cursor()
# 打印數據庫所有表的表名
for table_info in crsr.tables(tableType='TABLE'):
print(table_info.table_name)
cnxn.close()
- 連接MySQL
import pyodbc
# 連接數據庫(不需要配置數據源),connect()函數創建並返回一個 Connection 對象
cnxn = pyodbc.connect("""DRIVER={MySQL ODBC 8.1 Unicode Driver};
SERVER=localhost;DATABASE=sqllit;USER=root;PASSWORD=root;"""
)
# cursor()使用該連接創建(並返回)一個遊標或類遊標的對象
crsr = cnxn.cursor()
# 打印數據庫所有表的表名
for table_info in crsr.tables(tableType='TABLE'):
print(table_info.table_name)
cnxn.close()
- 連接SQL SERVER
import pyodbc
# 驅動一定安裝好,驅動名字從電腦ODBC數據源找
cn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER=localhost;DATABASE=testdb;UID=me;PWD=pass')
# 建立連接
cursor = cn.cursor()
# 執行SQL
cursor.execute("select user_id, user_name from users")
# 輸出結果
rows = cursor.fetchall()
for row in rows:
print(row.user_id, row.user_name)
cn.close()
pypyodbc
PyPyODBC是一個Python ODBC庫,它可以被視爲著名的PyODBC庫的純Python實現,它們的用法幾乎完全一樣。
基於純Python代碼的特質給PyPyODBC庫帶來極大的兼容性、可嵌入性和代碼移植性:PyPyODBC可以運行在CPython,IronPython和PyPy虛擬機下,可以運行在Windows,Linux平臺下,可以運行在Python 2.4、2.5、2.6、2.7等版本下,可以被嵌入在項目中,而無需在運行環境額外編譯和安裝ODBC模塊。
特點:
-
簡單輕便: PyPyODBC庫只有一個Python腳本文件,代碼不超過3000行。你可以很容易就把它嵌入到你的項目中。
-
內建Access MDB支持:在Windows平臺上,PyPyODBC即可自行創建Access數據庫而無需安裝微軟Office套件。
-
下載
pip install pypyodbc
-
連接Access
import pypyodbc # 連接數據庫(不需要配置數據源),connect()函數創建並返回一個 Connection 對象 cnxn = pypyodbc.connect(r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=D:\\work\\test\\sql\\test.mdb') # cursor()使用該連接創建(並返回)一個遊標或類遊標的對象 crsr = cnxn.cursor() # 打印數據庫所有表的表名 for table_info in crsr.tables(tableType='TABLE'): print(table_info[2]) cnxn.close()
-
連接MySQL
import pypyodbc # 連接數據庫(需要安裝驅動程序,驅動程序名字從OBDC數據源中找),connect()函數創建並返回一個 Connection 對象 cnxn = pypyodbc.connect("""DRIVER={MySQL ODBC 8.1 Unicode Driver}; SERVER=localhost;DATABASE=sqllit;USER=root;PASSWORD=root;""" ) # cursor()使用該連接創建(並返回)一個遊標或類遊標的對象 crsr = cnxn.cursor() sql = 'select * from admin_user' # 查詢數據 crsr.execute(sql) rows = crsr.fetchall() for row in rows: print(row) cnxn.close()
pymysql
pymysql是一個純Python 實現的MySQL客戶端操作的庫。
- 安裝
pip3 install PyMySQL
- 連接MySQL
import pymysql
# 打開數據庫連接
db = pymysql.connect(host='localhost',
user='root',
password='root',
database='sqllit')
# 使用 cursor() 方法創建一個遊標對象 cursor
cursor = db.cursor()
# 使用 execute() 方法執行 SQL,如果表存在則刪除
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")
# 使用預處理語句創建表
sql = """CREATE TABLE EMPLOYEE (
FIRST_NAME CHAR(20) NOT NULL,
LAST_NAME CHAR(20),
AGE INT,
SEX CHAR(1),
INCOME FLOAT )"""
cursor.execute(sql)
# SQL 插入語句
sql1 = """INSERT INTO EMPLOYEE(FIRST_NAME,
LAST_NAME, AGE, SEX, INCOME)
VALUES ('Mac1', 'Mohan1', 201, 'M', 20001)"""
# SQL 插入語句
sql2 = "INSERT INTO EMPLOYEE(FIRST_NAME, \
LAST_NAME, AGE, SEX, INCOME) \
VALUES ('%s', '%s', %s, '%s', %s)" % \
('Mac', 'Mohan', 20, 'N', 2000)
try:
# 執行sql語句
cursor.execute(sql1)
cursor.execute(sql2)
# 提交到數據庫執行
db.commit()
except:
# 如果發生錯誤則回滾
db.rollback()
# 查詢數據
cursor.execute("SELECT * FROM EMPLOYEE")
rows = cursor.fetchall()
for row in rows:
print(row)
# 關閉數據庫連接
db.close()
# 輸出
('Mac1', 'Mohan1', 201, 'M', 20001.0)
('Mac', 'Mohan', 20, 'N', 2000.0)
SQLAlchemy
SQLAlchemy是 Python 中最流行的 ORM(Object-Relational Mapping)框架,適用於複雜的數據庫操作和應用,可以連接SQlit和MySQL數據庫。
ORM 全稱 Object Relational Mapping
, 翻譯過來叫對象關係映射
。簡單的說,ORM 將數據庫中的表與面嚮對象語言中的類建立了一種對應關係。我們要操作數據庫,數據庫中的表或者表中的一條記錄就可以直接通過操作類或者類實例來完成,ORM 相當於把數據庫也給你實例。
- 安裝
pip install sqlalchemy
- 連接SQLit
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# 連接SQLit數據庫
engine = create_engine("sqlite:///mydatabase.db", echo=True)
# 連接MySQL數據庫
engine = create_engine('mysql+pymysql://root:root@localhost:3306/sqllit?charset=utf8')
Base = declarative_base()
# 定義數據表模型
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True)
name = Column(String)
age = Column(Integer)
# 創建數據表
Base.metadata.create_all(engine)
# 創建會話
Session = sessionmaker(bind=engine)
session = Session()
# 插入數據
user1 = User(name="Alice", age=25)
user2 = User(name="Bob", age=30)
session.add_all([user1, user2])
session.commit()
# 查詢數據
users = session.query(User).all()
for user in users:
print(user.name, user.age)
# 關閉會話
session.close()
# 輸出
D:\work\test\sql\SQLAlchemy.py:7: MovedIn20Warning: The ``declarative_base()`` function is now available as sqlalchemy.orm.declarative_base(). (deprecated since: 2.0) (Background on SQLAlchemy 2.0 at: https://sqlalche.me/e/b8d9)
Base = declarative_base()
2023-09-16 20:37:26,110 INFO sqlalchemy.engine.Engine BEGIN (implicit)
2023-09-16 20:37:26,110 INFO sqlalchemy.engine.Engine PRAGMA main.table_info("users")
2023-09-16 20:37:26,110 INFO sqlalchemy.engine.Engine [raw sql] ()
2023-09-16 20:37:26,111 INFO sqlalchemy.engine.Engine COMMIT
2023-09-16 20:37:26,112 INFO sqlalchemy.engine.Engine BEGIN (implicit)
2023-09-16 20:37:26,114 INFO sqlalchemy.engine.Engine INSERT INTO users (name, age) VALUES (?, ?) RETURNING id
2023-09-16 20:37:26,114 INFO sqlalchemy.engine.Engine [generated in 0.00009s (insertmanyvalues) 1/2 (ordered; batch not supported)] ('Alice', 25)
2023-09-16 20:37:26,120 INFO sqlalchemy.engine.Engine INSERT INTO users (name, age) VALUES (?, ?) RETURNING id
2023-09-16 20:37:26,120 INFO sqlalchemy.engine.Engine [insertmanyvalues 2/2 (ordered; batch not supported)] ('Bob', 30)
2023-09-16 20:37:26,122 INFO sqlalchemy.engine.Engine COMMIT
2023-09-16 20:37:26,126 INFO sqlalchemy.engine.Engine BEGIN (implicit)
2023-09-16 20:37:26,128 INFO sqlalchemy.engine.Engine SELECT users.id AS users_id, users.name AS users_name, users.age AS users_age
FROM users
2023-09-16 20:37:26,128 INFO sqlalchemy.engine.Engine [generated in 0.00024s] ()
Alice 25
Bob 30
2023-09-16 20:37:26,129 INFO sqlalchemy.engine.Engine ROLLBACK
MySQLdb
MySQLdb是一款較爲底層的,python連接mysql用的模塊。和更加高級的,提供ORM的模塊不同,MySQLdb主要還是聚焦於如何和數據庫進行連接和進行基本的操作,操作的體現形式主要還是進行SQL語句的執行。
- 安裝
# 先下載到本地(選擇python對應的版本下載)
https://pypi.org/project/mysqlclient/#files
# 再安裝
pip install .\mysqlclient-2.2.0-cp311-cp311-win_amd64.whl
- 連接MySQL
import MySQLdb
db = MySQLdb.connect(host='localhost',user='root',passwd='root',db='sqllit')
cursor = db.cursor() #創建一個遊標對象
sql = 'select * from admin_user'
# 查詢數據
cursor.execute(sql)
rows = cursor.fetchall()
for row in rows:
print(row)
cursor.close()
pymssql
pymssql是python用來連接Microsoft SQL Server的一個工具庫(package)。
- 安裝
pip install pymssql
- 連接SQL Server
import pymssql
conn = pymssql.connect(host='host',database='db_name',user='user',password='pwd',charset='utf8')
cursor = conn.cursor()
cursor.execute("sql statement")
# 如果執行的是修改操作,需要提交事務;如果執行的是查詢操作,不需要提交
conn.commit()
conn.close()