python | 连接数据库

介绍一些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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章