python | 连接数据库

python,连接,数据库 · 浏览次数 : 17

小编点评

## ORM模块介绍 ORM模块是Python中常用的数据库操作模块,可以帮助我们建立和使用数据库。它提供了更高级的数据库操作接口,可以帮助我们完成数据库操作的更复杂的操作。 **安装** 首先下载到本地(选择python对应的版本下载) ``` pip install mysqlclient ``` **连接** ```python import MySQLdbdb ``` **创建游标对象** ```python cursor = db.cursor() ``` **执行SQL语句** ```python cursor.execute("select * from admin_user") ``` **获取数据** ```python rows = cursor.fetchall() ``` **关闭游标对象** ```python cursor.close() ``` **示例** ```python # 连接MySQL数据库 db = MySQLdbdb.connect(host='localhost',user='root',passwd='root',db='sqllit') # 创建游标对象 cursor = db.cursor() # 执行SQL语句 cursor.execute("select * from admin_user") # 获取数据 rows = cursor.fetchall() # 关闭游标对象 cursor.close() # 关闭数据库连接 db.close() ``` **其他** * ORM模块提供了更高级的数据库操作接口,可以帮助我们完成数据库操作的更复杂的操作。 * ORM模块提供了更高级的数据库操作接口,可以帮助我们完成数据库操作的更复杂的操作。 * ORM模块可以帮助我们完成数据库操作的更复杂的操作,例如执行修改操作、查询操作等。

正文

介绍一些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()

与python | 连接数据库相似的内容:

python | 连接数据库

介绍一些python中用于连接常用数据库的依赖库。 SQLite3 SQLite3是Python 中自带的数据库模块,适用于小型应用和快速原型开发。 SQLite是一个进程内的库,实现了自给自足的、无服务器的、是非常小的,是轻量级的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,不需要在系统

算法金 | Python 中有没有所谓的 main 函数?为什么?

​大侠幸会,在下全网同名[算法金] 0 基础转 AI 上岸,多个算法赛 Top [日更万日,让更多人享受智能乐趣] 定义和背景 在讨论Python为何没有像C或Java那样的明确的main函数之前,让我们先理解一下什么是main函数以及它在其他编程语言中的作用。 在C和C++等语言中,main函数是

《对线面试官》| 高频 Python 面试题 pt.1

**1.聊聊 python 中的值传递和引用传递吧** - 值传递: 值传递意味着在函数调用时,将实际参数的值复制一份传递给函数的形式参数 在函数内部,形式参数将作为局部变量使用,对形式参数的修改不会影响原始变量的值 - 引用传递 引用传递意味着在函数调用时,将实际参数的引用(内存地址)传递给函数的

算法金 | 只需十四步:从零开始掌握Python机器学习(附资源)

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 1. 引言 1.1 教程目的与读者定位 "启程"往往是最具挑战性的一步,特别是在面临众多选择时,人们往往难以做出决策。本教程旨在帮助那些几乎没有Python机器学习基础的初学者成长为知识

算法金 | 10 大必知的自动化机器学习库(Python)

大侠幸会,在下全网同名[算法金] 0 基础转 AI 上岸,多个算法赛 Top [日更万日,让更多人享受智能乐趣] 一、入门级自动化机器学习库 1.1 Auto-Sklearn 简介: Auto-Sklearn 是一个自动机器学习库,基于 Python 的 scikit-learn 接口。它主要用于自

python 爬虫某东网商品信息 | 没想到销量最高的是

哈喽大家好,我是咸鱼 好久没更新 python 爬虫相关的文章了,今天我们使用 selenium 模块来简单写个爬虫程序——爬取某东网商品信息 网址链接:https://www.jd.com/ 完整源码在文章最后 ## 元素定位 我们需要找到网页上元素的位置信息(xpth 路径) ![image](

Python常见面试题016. 请实现如下功能|谈谈你对闭包的理解

016. 请实现如下功能|谈谈你对闭包的理解 摘自<流畅的python> 第七章 函数装饰器和闭包 实现一个函数(可以不是函数)avg,计算不断增加的系列值的平均值,效果如下 def avg(...): pass avg(10) =>返回10 avg(20) =>返回10+20的平均值15 avg(

Python常见面试题009. 元组和列表有什么区别

009. 元组和列表有什么区别 这个题是简单的,但要拿满分或者说高分不容易 相同点 | 共性 | 说明 | | | | | 可以存放任意元素 | 一般都放同类型 | | 支持索引访问 | 甚至是负数 | | 支持切片操作 | | | 逗号分隔元素 | | | 都是有序集合(容器) | | | 可以随

第一作者解读|我们这篇Nature Communication背后的故事

2024年7月16日,大暑将至,立秋不远。我们基于Python的转录组学全分析框架的文章——"OmicVerse: a framework for bridging and deepening insights across bulk and single-cell sequencing"——正式在

算法金 | 时间序列预测真的需要深度学习模型吗?是的,我需要。不,你不需要?

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 参考 论文:https://arxiv.org/abs/2101.02118 更多内容,见微*公号往期文章: 审稿人:拜托,请把模型时间序列去趋势!! 使用 Python 快速上手 LS