sqlalchemy的快速使用

sqlalchemy 是一个企业级的orm框架

类似于Django 的orm框架---》只能用在django框架中,不能用在别的位置

sqlalchemy可以单独使用,也可以用在其他框架中

安装

pip install sqlalchemy

SQLAlchemy本身无法操作数据库,其必须依赖pymsql等第三方插件

# Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如:
MySQL-Python
    mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>
    
pymysql
    mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]
    
MySQL-Connector
    mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>
    
cx_Oracle
    oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]
    
更多:http://docs.sqlalchemy.org/en/latest/dialects/index.html

sqlalchemy原生操作

# 操作原生sql ---》用得少
import pymysql
import threading

# 1 导入
from sqlalchemy import create_engine
from sqlalchemy.engine.base import Engine

# 2 创建引擎
engine = create_engine(
    "mysql+pymysql://root:1234@127.0.0.1:3306/cnblogs",
    max_overflow=0,  # 超过连接池大小外最多创建的连接
    pool_size=5,     # 连接池大小
    pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错
    pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置)
)

# 3 使用引擎,拿到链接
conn = engine.raw_connection()

# 4 剩下的和操作pymysql一样
cursor=conn.cursor(pymysql.cursors.DictCursor)
cursor.execute('select * from article limit 10')
res=cursor.fetchall()

print(res)

## 多线程测试:
def task(arg):
    conn = engine.raw_connection()
    cursor = conn.cursor()
    cursor.execute(
        "select * from article"
    )
    result = cursor.fetchall()
    print(result)
    cursor.close()
    conn.close()

for i in range(20):
    t = threading.Thread(target=task, args=(i,))
    t.start()

sqlalchemy操作表

创建删除表

# 1 导入
import datetime
from sqlalchemy import create_engine
from sqlalchemy.orm import declarative_base
from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, UniqueConstraint, Index

Base = declarative_base()  # Base 当成 models.Model

# 2 创建表模型
class User(Base):
    __tablename__ = 'users'  # 表名
    # 写字段
    id = Column(Integer, primary_key=True, autoincrement=True)  # id 主键
    name = Column(String(32), index=True, nullable=False)  # name列,索引,不可为空
    email = Column(String(32), unique=True)
    # datetime.datetime.now不能加括号,加了括号,以后永远是当前时间
    ctime = Column(DateTime, default=datetime.datetime.now)
    extra = Column(Text)

# 3 没有命令---》后期使用第三方模块,可以有命令
# 目前需要手动做
# sqlalchemy 不能创建数据库,能创建表,删除表,不能删除增加字段(第三方模块)

# 3.1 创建引擎
engine = create_engine(
    "mysql+pymysql://root:1234@127.0.0.1:3306/sqlalchemy01",
    max_overflow=0,  # 超过连接池大小外最多创建的连接
    pool_size=5,  # 连接池大小
    pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错
    pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置)
)

# 3.2 把表模型同步到数据库中
Base.metadata.create_all(engine)

# 3.3 删除表
Base.metadata.drop_all(engine)

简单增删改查操作

from models import User

from sqlalchemy import create_engine

# 1 创建引擎
engine = create_engine(
    "mysql+pymysql://root:1234@127.0.0.1:3306/sqlalchemy01",
    max_overflow=0,  # 超过连接池大小外最多创建的连接
    pool_size=5,  # 连接池大小
    pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错
    pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置)
)

# 2 orm操作--》借助于 engine 得到session(conn)对象
from sqlalchemy.orm import sessionmaker

Connection = sessionmaker(bind=engine)
conn = Connection()

# 3 使用conn---》进行orm操作
# 3.1 增加数据
user = User(name='xxx', email='3@qq.com')
# 插入到数据库
conn.add(user)  # 放个对象
# 提交
conn.commit()
# 关闭链接
conn.close()

# 3.2 查询数据
# 查询User表中id为1的所有记录--》放到列表中
res=conn.query(User).filter_by(id=1).all()
print(res)

# 3.3 删除
res = conn.query(User).filter_by(name='lqz').delete()
print(res)
conn.commit()

# 3.4 修改
res=conn.query(User).filter_by(name='9999').update({'extra':'xxsss'})
conn.commit()
posted @ 2024-03-07 17:14  wellplayed  阅读(14)  评论(0编辑  收藏  举报