SQLALchemy笔记
使用SQLAlchemy去连接数据库:
使用SQLALchemy去连接数据库,需要使用一些配置信息,然后将他们组合成满足条件的字符串:
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'first_sqlalchemy'
USERNAME = 'root'
PASSWORD = 'root'
# dialect+driver://username:password@host:port/database
DB_URI = "mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset=utf8".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE)
然后使用create_engine
创建一个引擎engine
,然后再调用这个引擎的connect
方法,就可以得到这个对象,然后就可以通过这个对象对数据库进行操作了:
engine = create_engine(DB_URI)
# 判断是否连接成功
conn = engine.connect()
result = conn.execute('select 1')
print(result.fetchone())
ORM介绍:
- ORM:Object Relationship Mapping
- 大白话:对象模型与数据库表的映射
将ORM模型映射到数据库中:
- 用
declarative_base
根据engine
创建一个ORM基类。from sqlalchemy.ext.declarative import declarative_base engine = create_engine(DB_URI) Base = declarative_base(engine)
- 用这个
Base
类作为基类来写自己的ORM类。要定义__tablename__
类属性,来指定这个模型映射到数据库中的表名。class Person(Base): __tablename__ = 'person'
- 创建属性来映射到表中的字段,所有需要映射到表中的属性都应该为Column类型:
class Person(Base): __tablename__ = 'person' # 2. 在这个ORM模型中创建一些属性,来跟表中的字段进行一一映射。这些属性必须是sqlalchemy给我们提供好的数据类型。 id = Column(Integer,primary_key=True,autoincrement=True) name = Column(String(50)) age = Column(Integer)
- 使用
Base.metadata.create_all()
来将模型映射到数据库中。 - 一旦使用
Base.metadata.create_all()
将模型映射到数据库中后,即使改变了模型的字段,也不会重新映射了。
用session做数据的增删改查操作:
- 构建session对象:所有和数据库的ORM操作都必须通过一个叫做
session
的会话对象来实现,通过以下代码来获取会话对象:from sqlalchemy.orm import sessionmaker engine = create_engine(DB_URI) session = sessionmaker(engine)()
- 添加对象:
- 创建对象,也即创建一条数据:
p = Person(name='zhiliao',age=18,country='china')
- 将这个对象添加到
session
会话对象中:session.add(p)
- 将session中的对象做commit操作(提交):
session.commit()
- 一次性添加多条数据:
p1 = Person(name='zhiliao1',age=19,country='china') p2 = Person(name='zhiliao2',age=20,country='china') session.add_all([p1,p2]) session.commit()
- 创建对象,也即创建一条数据:
- 查找对象:
# 查找某个模型对应的那个表中所有的数据: all_person = session.query(Person).all() # 使用filter_by来做条件查询 all_person = session.query(Person).filter_by(name='zhiliao').all() # 使用filter来做条件查询 all_person = session.query(Person).filter(Person.name=='zhiliao').all() # 使用get方法查找数据,get方法是根据id来查找的,只会返回一条数据或者None person = session.query(Person).get(primary_key) # 使用first方法获取结果集中的第一条数据 person = session.query(Person).first()
- 修改对象:首先从数据库中查找对象,然后将这条数据修改为你想要的数据,最后做commit操作就可以修改数据了。
person = session.query(Person)