import datetimeimport sqlalchemyfrom sqlalchemy import create_enginefrom urllib.parse import quotefrom sqlalchemy.orm import declarative_base, Sessionfrom sqlalchemy import Column, DateTime, String, insert, Integer, update, delete, selectimport time"""create database learn_db;use learn_db;create table staff(id int auto_incrementprimary key,create_time datetime null,name varchar(255) not null,address varchar(255) not null);"""print(sqlalchemy.__version__)"""https://docs.sqlalchemy.org/en/14/tutorial/engine.htmlfuture=True代表使用2.0风格的连接 在2.0`with engine.connect() as conn` 代码将不会自动commit, 并且会在代码块中执行ROLLBACK`with Session(engine) as session` 在2.0同样不会自动提交 并且会在代码块中执行ROLLBACK(如果没有commit)"""engine = create_engine(f'mysql://root:{quote("kexin@kexin2021")}@192.168.1.80/learn_db', echo=True, future=True,pool_size=3)engine.connect()Base = declarative_base(engine)# time.sleep(100)# see https://docs.sqlalchemy.org/en/14/tutorial/metadata.html#declaring-mapped-classesclass Staff(Base):__tablename__ = 'staff2'id = Column(Integer, primary_key=True)create_time = Column(DateTime)name = Column(String(255))address = Column(String(255))def __str__(self):return f'[id: {self.id}, name: {self.name}, address: {self.address}]'Base.metadata.drop_all()Base.metadata.create_all()def a():# createwith Session(engine) as session:obj: Staff = Staff()obj.address = '北京2'obj.name = 'tom'obj.create_time = datetime.datetime.now()session.add(obj)session.commit()# session.flush() https://docs.sqlalchemy.org/en/14/tutorial/orm_data_manipulation.html#flushing 没有必要flusha()def b():# read# https://docs.sqlalchemy.org/en/14/tutorial/data_select.html#the-select-sql-expression-constructwith Session(engine) as session:from sqlalchemy.engine.row import Rowfrom sqlalchemy.engine.result import ChunkedIteratorResultstmt = select(Staff).where(Staff.name == 'tom')for i in session.execute(stmt): # i 是Row类型print('obj111111111-->', i, type(i), i[0].name)res = session.execute(stmt).first() # first 即使数据不存在也不会异常print('obj22222222222222222-->', res, type(res), res[0]) # res[0]是Staff 如果没有数据那么是None异常stmt = select(Staff).where(Staff.name == 'tom2')res2 = session.execute(stmt)print('resssss->', type(res2))try:print('obj3-->', res2.scalar_one_or_none()) # scalar_one数据不存在会异常, scalar_one_or_none()则不会异常except Exception as e:print(e, type(e))b()def c():# updatewith Session(engine) as session:# https://docs.sqlalchemy.org/en/14/tutorial/orm_data_manipulation.html#updating-orm-objectssession.execute(update(Staff).where(Staff.name == 'tom').values(name='tom_update'))session.commit()stmt = select(Staff).where(Staff.name == 'tom_update')res = session.execute(stmt)obj: Staff = res.scalar_one_or_none()if obj:obj.name = 'tom_update2'session.add(obj)session.commit()c()# deletewith Session(engine) as session:# https://docs.sqlalchemy.org/en/14/tutorial/orm_data_manipulation.html#deleting-orm-objects# stmt = select(Staff).where(Staff.name == 'tom_update2')# res: ChunkedIteratorResult = session.execute(stmt)# obj: Staff = res.scalar_one_or_none()# session.delete(obj)# session.commit()from sqlalchemy.engine.cursor import CursorResultstmt2 = delete(Staff).where(Staff.name == 'tom_update2')res11: CursorResult = session.execute(stmt2)print(res11, type(res11), '影响的行数:',res11.rowcount) # https://docs.sqlalchemy.org/en/14/tutorial/data_update.html#getting-affected-row-count-from-update-deletesession.commit()# createwith Session(engine) as session:obj: Staff = Staff()obj.address = '北京2'obj.name = 'tom'obj.create_time = datetime.datetime.now()session.add(obj)session.commit()# 长事物session = Session(engine)# try:# session.execute(update(Staff).where(Staff.name == 'tom').values(name='tom_update_long_trans', create_time='sdsd'))# except Exception as e:# print('出现异常没有调用commit或者collback')# else:# session.commit()with session:try:session.execute(update(Staff).where(Staff.name == 'tom').values(name='tom_update_long_trans', create_time='sdsd'))except Exception as e:print('出现异常没有调用commit或者collback')else:session.commit()time.sleep(100)# select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>10
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。