python学习--SQLAlchemy

ORM

ORM,对象关系映射,对象和关系之间的映射,使用面向对象的方式来操作数据库

关系模型和Python对象之间的映射
table  => class    ,表映射为类
row    => object   ,行映射为实例
column => property ,字段映射为属性

SQLAlchemy

安装

$ pip install sqlalchemy

文档

官方文档 http://docs.sqlalchemy.org/en/latest/
查看版本

import sqlalchemy
print(sqlalchemy.__version__)

开发

SQLAlchemy内部使用了连接池

创建连接

数据库连接的事情,交给引擎

from sqlalchemy import create_engine

dialect+driver://username:password@host:port/database

mysqldb的连接
mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>
engine = sqlalchemy.create_engine("mysql+mysqldb://test:[email protected]:3306/test")

pymysql的连接
mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]
engine = sqlalchemy.create_engine("mysql+pymysql://test:[email protected]:3306/test")
engine = sqlalchemy.create_engine("mysql+pymysql://test:[email protected]:3306/test",
echo=True)

echo=True
引擎是否打印执行的语句,调试的时候打开很方便。

lazy connecting:懒连接。创建引擎并不会马上连接数据库,直到让数据库执行任务时才连接。

Declare a Mapping创建映射

创建基类

from sqlalchemy.ext.declarative import declarative_base
# 创建基类,便于实体类继承。SQLAlchemy大量使用了元编程
Base = declarative_base() # 内部实现描述器

创建实体类

student表

CREATE TABLE student (
    id INTEGER NOT NULL AUTO_INCREMENT,
    name VARCHAR(64) NOT NULL,
    age INTEGER,
    PRIMARY KEY (id)
)
from sqlalchemy import Column, Integer, String

# 创建实体类
class Student(Base):
    # 指定表名
    __tablename__ = 'student'
    # 定义类属性对应字段
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(64), nullable=False)
    age = Column(Integer)
    # 第一参数是字段名,如果和属性名不一致,一定要指定
    # 例如:a = Column('age', Integer)

    def __repr__(self):
        return "{} id={} name={} age={}".format(
            self.__class__.__name__, self.id, self.name, self.age)

# 查看表结构
print(Student)
print(repr(Student.__table__))

# 显示结果
Table('student', MetaData(bind=None),
    Column('id', Integer(), table=<student>, primary_key=True, nullable=False),
    Column('name', String(length=64), table=<student>, nullable=False),
    Column('age', Integer(), table=<student>),
    schema=None)

__tablename__指定表名
Column类指定对应的字段,必须指定, 第一参数是字段名, 如果和属性名一致, 则不需要传参

实例化

s = Student(name='tom')
print(s.name)
s.age = 20
print(s.age)

创建表

可以使用SQLAlchemy来创建、删除表

# 删除继承自Base的所有表
Base.metadata.drop_all(engine)
# 创建继承自Base的所有表
Base.metadata.create_all(engine)

生产环境很少这样创建表,都是系统上线的时候由脚本生成。
生产环境很少删除表,宁可废弃都不能删除

创建会话session

在一个会话中操作数据库,会话建立在连接上,连接被引擎管理。
当第一次使用数据库时,从引擎维护的连接池中获取一个连接使用

# 创建session
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm.session import Session

# Session = sessionmaker(bind=engine) # 工厂方法返回类
session:Session = sessionmaker(bind=engine)() # 实例化
# 依然在第一次使用时连接数据库

session对象线程不安全。所以不同线程应该使用不用的session对象。
Session类和engine有一个就行了

CRUD操作

add():增加一个对象
add_all():可迭代对象,元素是对象

import sqlalchemy
from sqlalchemy import create_engine, Column, String, Integer
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

# mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]

IP = "127.0.0.1" # IP
USERNAME = "test" # 用户名称
PASSWORD = "test" # 用户密码
DBNAME = "test" # 数据库名称
PORT = 3306 # 端口
# 用户名称, 密码, IP, 端口, 数据库名称
# 创建引擎
engine = create_engine("mysql+pymysql://{}:{}@{}:{}/{}".format(
    USERNAME, PASSWORD, IP, PORT, DBNAME
),echo=True) # lazy 懒连接

# Base.metadata.drop_all(engine) # 删除Base管理的所有类对应的表
# Base.metadata.create_all(engine) # 创建Base管理的所有类对应的表

###########################################

# ORM Mapping  创建映射
Base = declarative_base() # 基类

# 内部实现描述器
class Student(Base):
    __tablename__ = "student" # 表名称

    # 定义字段类型和属性
    id = Column(Integer, primary_key=True, autoincrement=True) # 第一个写字段名, 如果字段名和属性名相同, 则省略不写
    name = Column(String(64), nullable=False)
    age = Column(Integer)

    def __repr__(self):
        return "<{} id={}, name={}, age={}>".format(
            __class__.__name__, self.id, self.name, self.age
        )

# 创建会话
from sqlalchemy.orm.session import Session

# Session = sessionmaker(bind=engine) # 绑定engine, 工厂方法返回类
session:Session = sessionmaker(bind=engine)() # 线程不安全

#####################
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
学习Python的最详细的路线可能因个人需求和学习风格而有所不同。然而,下面是一个常见的Python学习路线,可以帮助你系统地学习Python编程语言: 1. 学习基本概念和语法: - 安装Python解释器和开发环境(如Anaconda、PyCharm等)。 - 学习Python的基本语法、数据类型、变量、运算符、条件语句、循环语句等基本概念。 - 熟悉Python的内置函数和标准库。 2. 掌握核心概念和特性: - 学习函数和模块的概念,了解如何创建和使用自定义函数和模块。 - 理解面向对象编程(OOP)的概念,包括类、对象、继承、多态等。 - 掌握异常处理机制,学会使用try-except语句来处理异常情况。 - 学习文件操作和输入/输出(I/O)操作。 3. 学习常用库和框架: - 学习使用常用的Python库,如NumPy(科学计算)、Pandas(数据处理)、Matplotlib(数据可视化)等。 - 掌握使用Python进行网络编程,如使用Requests库进行HTTP请求、使用Scrapy进行网页爬虫等。 - 学习使用数据库,如MySQL或SQLite等,以及Python的数据库操作库,如SQLAlchemy。 - 探索Python的Web开发框架,如Django或Flask,学习构建Web应用程序。 4. 深入学习和实践: - 学习使用Python进行数据分析和机器学习,如使用Scikit-learn、TensorFlow等库。 - 理解并实践Python的并发编程,包括多线程、多进程和异步编程。 - 学习使用Python进行自动化任务,如编写脚本、定时任务等。 - 参与开源项目、完成编程挑战和解决实际问题,以提升实际应用能力。 5. 持续学习和扩展: - 阅读Python相关的书籍、教程和文档,掌握更深入的知识和技巧。 - 参与Python社区和论坛,与其他开发者交流和分享经验。 - 持续关注Python的新特性和发展,保持学习的动力。 需要注意的是,这只是一个大致的学习路线,你可以根据自己的需求和兴趣进行调整。同时,不要忽视实践的重要性,通过编写代码并解决实际问题来巩固所学知识。祝你在学习Python的过程中取得好成果!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值