FastApi+sqlalchemy异步操作mysql
环境:
pip install sqlalchemy==1.4.7 # sqlalchemy 1.4 以前的版本 没有数据库的异步操作
pip install aiomysql==0.0.21 # 一个异步操作mysql的库
数据库的连接:
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
# 连接字符串,
SQLALCHEMY_DATABASE_URL = "mysql+aiomysql://root:123456@xx.xx.xx.xx:3306/xx?charset=utf8mb4"
目前发现的问题是,如果数据库的密码中有@字符串,如:密码是 123@456 此时连接字符串被拆分出来的服务器ip是456@xx.xx.xx.xx,这个ip是连不上数据库的,此时需要改动sqlalchemy的源码,在url.py中的_parse_rfc1738_args()方法(如果没更新的话,在705行),将(?:😦?P[^@]))? 这个正则表达式改成(?:😦?P[^@].))?,进行匹配,这样就会根据最后一个@区分割连接字符串了。
engine = create_async_engine(SQLALCHEMY_DATABASE_URL)
SessionLocal = sessionmaker(
class_=AsyncSession,
autocommit=False,
autoflush=False,
bind=engine
)
# 运用 yield 抛出session
async def get_db_session() -> AsyncSession:
async with SessionLocal() as session:
yield session
这里运用 FastAPI框架+sqlalchemy+mysql 去做后端,一个简单的demo如下:
表格模型:
from sqlalchemy import Column, Integer, Sequence, String, DateTime, BigInteger, Boolean, Float
class LabFileInfo(Base):
__tablename__ = 'table_demo'
file_id = Column(String, primary_key=True)
file_name = Column(String)
file_url = Column(String)
file_type = Column(Integer)
template_type = Column(Integer)
school_id = Column(Integer)
store_flag = Column(Integer)
del_flag = Column(Integer)
creater_id = Column(String)
create_time = Column(DateTime)
updater_id = Column(String)
update_time = Column(DateTime)
def to_dict(self):
return dict(file_id=self.file_id, file_name=self.file_name, file_url=self.file_url, file_type=self.file_type,
template_type=self.template_type, school_id=self.school_id, store_flag=self.store_flag,
creater_id=self.creater_id, create_t