1 orm框架介绍
-1 django-orm
-2 peewee
-----同步orm框架-----
-3 sqlalchemy
---中间态----
-4 Tortoise ORM
-众多第三方库---》都是同步的--》导致异步框架性能发挥不出来
-redis:aioredis --》redis-py
-mysql:aiomysql --》pymysql
1.1 快速使用
- 2.0.30版本
Engine,框架的引擎
Connection Pooling ,数据库连接池
Dialect,选择连接数据库的DB API种类
SQL Exprression Language,SQL表达式语言
engine = create_engine("postgresql://scott:tiger@localhost/mydatabase")
engine = create_engine("postgresql+psycopg2://scott:tiger@localhost/mydatabase")
engine = create_engine("postgresql+pg8000://scott:tiger@localhost/mydatabase")
engine = create_engine("mysql://scott:tiger@localhost/foo")
engine = create_engine("mysql+mysqldb://scott:tiger@localhost/foo")
engine = create_engine("mysql+pymysql://scott:tiger@localhost/foo")
engine = create_engine("oracle://scott:tiger@127.0.0.1:1521/sidname")
engine = create_engine("oracle+cx_oracle://scott:tiger@tnsname")
engine = create_engine("mssql+pyodbc://scott:tiger@mydsn")
engine = create_engine("mssql+pymssql://scott:tiger@hostname:port/dbname")
engine = create_engine("sqlite:////absolute/path/to/foo.db")
engine = create_engine("sqlite:///C:\\path\\to\\foo.db")
engine = create_engine(r"sqlite:///C:\path\to\foo.db")
2 sqlalchemy 原生操作
from sqlalchemy import create_engine
engine = create_engine(
"mysql+pymysql://root:123456@127.0.0.1:3307/flask_base?charset=utf8",
max_overflow=0,
pool_size=5,
pool_timeout=30,
pool_recycle=-1
)
def task():
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)
t.start()
3 sqlalchemy操作表
3.1原生表的 创建和删除表
from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, UniqueConstraint, Index
import datetime
from sqlalchemy.orm import DeclarativeBase
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__='user'
id=Column(Integer,primary_key=True,autoincrement=True)
name = Column(String(32), index=True, nullable=False)
email = Column(String(32), unique=True)
ctime = Column(DateTime, default=datetime.datetime.now)
extra = Column(Text, nullable=True)
if __name__ == '__main__':
from sqlalchemy import create_engine
engine = create_engine(
"mysql+pymysql://root:123456@127.0.0.1:3307/sqlalchemy001?charset=utf8",
max_overflow=0,
pool_size=5,
pool_timeout=30,
pool_recycle=-1
)
Base.metadata.drop_all(engine)
1.2 增删查改
from models import User
from sqlalchemy import create_engine
engine = create_engine(
"mysql+pymysql://root:123456@127.0.0.1:3307/sqlalchemy001?charset=utf8",
max_overflow=0,
pool_size=5,
pool_timeout=30,
pool_recycle=-1
)
from sqlalchemy.orm import Session
session=Session(engine)
user1=User(name='hope',email='333@qq.com')
user2=User(name='Tony',email='335@qq.com')
session.add_all([user1,user2])
session.commit()
session.close()
4 一对多关系
4.1 建表
class Hobby(Base):
__tablename__ = 'hobby'
id = Column(Integer, primary_key=True)
caption = Column(String(50), default='篮球')
def __str__(self):
return self.caption
class Person(Base):
__tablename__ = 'person'
nid = Column(Integer, primary_key=True)
name = Column(String(32), index=True, nullable=True)
hobby_id = Column(Integer, ForeignKey("hobby.id"))
hobby = relationship('Hobby', backref='pers')
def __str__(self):
return self.name
def __repr__(self):
return self.name
from models import Person,Hobby
from sqlalchemy import create_engine
engine = create_engine(
"mysql+pymysql://root:123456@127.0.0.1:3307/sqlalchemy001?charset=utf8",
max_overflow=0,
pool_size=5,
pool_timeout=30,
pool_recycle=-1
)
from sqlalchemy.orm import Session
session=Session(engine)
if __name__ == '__main__':
hobby = session.query(Hobby).filter_by(id=1).first()
print(hobby.caption)
print(hobby.pers)
5 scoped线程安全
-每个视图函数,用同一个session,有问题
-代码有点麻烦
from models import User
import threading
from sqlalchemy import create_engine
engine = create_engine(
"mysql+pymysql://root:123456@127.0.0.1:3307/sqlalchemy001?charset=utf8",
max_overflow=0,
pool_size=5,
pool_timeout=30,
pool_recycle=-1
)
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm import scoped_session
Session = sessionmaker(bind=engine)
session=scoped_session(Session)
def task(se,i):
session=se()
session.add(User(name='xxx',email=f'{i}@qq.com'))
session.commit()
print('=========',session)
if __name__ == '__main__':
l=[]
for i in range(10):
t=threading.Thread(target=task,args=[session,i])
t.start()
l.append(t)
for i in l:
i.join()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异