SQLAlchemy是一个数据库的ORM框架,安装命令为`pip install sqlalchemy==1.4.46
ORM:Object Relationship Mapping,既对象关系映射,通过ORM我们可以通过类的方式去操作数据库,而不用再写原生的SQL语句。
通过把表映射成类,把行作为实例对象,把字段作为类属性,ORM在执行对象操作的时候最终还是会把对应的操作转化为数据库原生语句。
其主要优点有:
1.性能损耗小
2. 设计灵活
3. 可移植性强
4. 易用
from sqlalchemy import create_engine, Column, Integer, String,Enum,ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship,sessionmaker
# 配置链接数据库信息
db_config = {'host': '127.0.0.1','port': '3306','database': 'mytest1','username': 'root','password': '123456'
}
# 数据库链接地址
db_url = 'mysql+pymysql://{username}:{password}@{host}:{port}/{database}?charset=utf8'.format(**db_config)
# 创建数据库引擎
engine = create_engine(db_url)
Base = declarative_base(engine)
class Person(Base):# 表名__tablename__ = 'person'# 2. 在这个ORM模型中创建一些属性,来跟表中的字段进行一一映射,这些属性必须是sqlalchemy提供好的数据类型# 设定id为Int,主键, 自增长id = Column(Integer, primary_key=True, autoincrement=True)# String类型需要指定长度name = Column(String(50))age = Column(Integer)
#删除表
#Base.metadata.drop_all(engine)
#创建表
Base.metadata.create_all(engine)
from sqlalchemy import create_engine, Column, Integer, String,Enum,ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship,sessionmaker
# 配置链接数据库信息
db_config = {'host': '127.0.0.1','port': '3306','database': 'mytest1','username': 'root','password': '123456'
}
# 数据库链接地址
db_url = 'mysql+pymysql://{username}:{password}@{host}:{port}/{database}?charset=utf8'.format(**db_config)
# 创建数据库引擎
engine = create_engine(db_url)
Base = declarative_base(engine)
class Person(Base):# 表名__tablename__ = 'person'# 2. 在这个ORM模型中创建一些属性,来跟表中的字段进行一一映射,这些属性必须是sqlalchemy提供好的数据类型# 设定id为Int,主键, 自增长id = Column(Integer, primary_key=True, autoincrement=True)# String类型需要指定长度name = Column(String(50))age = Column(Integer)
session = sessionmaker(engine)()
#新增一条数据
p1 = Person(name='张三', age=18)
session.add(p1)
session.commit()
#新增多条数据
p2 = Person(name='李四', age=19)
p3 = Person(name='王五', age=20)
session.add_all([p1,p2])
session.commit()
from sqlalchemy import create_engine, Column, Integer, String,Enum,ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship,sessionmaker
# 配置链接数据库信息
db_config = {'host': '127.0.0.1','port': '3306','database': 'mytest1','username': 'root','password': '123456'
}
# 数据库链接地址
db_url = 'mysql+pymysql://{username}:{password}@{host}:{port}/{database}?charset=utf8'.format(**db_config)
# 创建数据库引擎
engine = create_engine(db_url)
Base = declarative_base(engine)
class Person(Base):# 表名__tablename__ = 'person'# 2. 在这个ORM模型中创建一些属性,来跟表中的字段进行一一映射,这些属性必须是sqlalchemy提供好的数据类型# 设定id为Int,主键, 自增长id = Column(Integer, primary_key=True, autoincrement=True)# String类型需要指定长度name = Column(String(50))age = Column(Integer)
session = sessionmaker(engine)()
person = session.query(Person).first()
session.delete(person)
session.commit()
from sqlalchemy import create_engine, Column, Integer, String,Enum,ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship,sessionmaker
# 配置链接数据库信息
db_config = {'host': '127.0.0.1','port': '3306','database': 'mytest1','username': 'root','password': '123456'
}
# 数据库链接地址
db_url = 'mysql+pymysql://{username}:{password}@{host}:{port}/{database}?charset=utf8'.format(**db_config)
# 创建数据库引擎
engine = create_engine(db_url)
Base = declarative_base(engine)
class Person(Base):# 表名__tablename__ = 'person'# 2. 在这个ORM模型中创建一些属性,来跟表中的字段进行一一映射,这些属性必须是sqlalchemy提供好的数据类型# 设定id为Int,主键, 自增长id = Column(Integer, primary_key=True, autoincrement=True)# String类型需要指定长度name = Column(String(50))age = Column(Integer)
session = sessionmaker(engine)()
person = session.query(Person).first()
person .name = '食铁兽'
session.commit()
from sqlalchemy import create_engine, Column, Integer, String,Enum,ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship,sessionmaker
# 配置链接数据库信息
db_config = {'host': '127.0.0.1','port': '3306','database': 'mytest1','username': 'root','password': '123456'
}
# 数据库链接地址
db_url = 'mysql+pymysql://{username}:{password}@{host}:{port}/{database}?charset=utf8'.format(**db_config)
# 创建数据库引擎
engine = create_engine(db_url)
Base = declarative_base(engine)
class Person(Base):# 表名__tablename__ = 'person'# 2. 在这个ORM模型中创建一些属性,来跟表中的字段进行一一映射,这些属性必须是sqlalchemy提供好的数据类型# 设定id为Int,主键, 自增长id = Column(Integer, primary_key=True, autoincrement=True)# String类型需要指定长度name = Column(String(50))age = Column(Integer)
session = sessionmaker(engine)()
query_person = session.query(Person)
#查找所有数据
all_person = query_person.all()
for person in all_person:print(person)
#查找第一条数据
all_person = query_person.first()
for person in all_person:print(person)
#查找和主键相同的数据,返回一条数据或None
person = query_person.get(2)
print(person)
#filter_by:通过参数中的值,来查找符合参数中的值的数据,返回一个查找对象
all_person = query_person.filter_by(name='食铁兽').all()
for person in all_person:print(person)
#filter:通过参数中的布尔表达式,来查找使布尔表达式为True的数据,返回一个查找对象,注意:参数必须是类.属性名,功能比filter_by更强
person = query_person.filter(Person.name == '王五').first()
print(person)
在sqlalchemy中,如果想要将两个模型映射成一对一的关系,那么应该在父模型中,指定引用的时候,要传递一个uselist=False这个参数进去。就是告诉父模型,以后引用这个从模型的时候,不再是一个列表了,而是一个对象了
from sqlalchemy import create_engine, Column, Integer, String,Enum,ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship,sessionmaker
# 配置链接数据库信息
db_config = {'host': '127.0.0.1','port': '3306','database': 'mytest1','username': 'root','password': '123456'
}
# 数据库链接地址
db_url = 'mysql+pymysql://{username}:{password}@{host}:{port}/{database}?charset=utf8'.format(**db_config)
# 创建数据库引擎
engine = create_engine(db_url)
Base = declarative_base(engine)
class User(Base):__tablename__ = 'user'id = Column(Integer,primary_key=True,autoincrement=True)username = Column(String(50),nullable=False)extend = relationship("UserExtend",uselist=False)def __repr__(self):return "" % self.usernameclass UserExtend(Base):__tablename__ = 'user_extend'id = Column(Integer, primary_key=True, autoincrement=True)school = Column(String(50))uid = Column(Integer,ForeignKey("user.id"))user = relationship("User",backref="extend")Base.metadata.create_all(engine)
可以借助sqlalchemy.orm.backref来简化代码
from sqlalchemy import create_engine, Column, Integer, String,Enum,ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship,sessionmaker,backref
# 配置链接数据库信息
db_config = {'host': '127.0.0.1','port': '3306','database': 'mytest1','username': 'root','password': '123456'
}
# 数据库链接地址
db_url = 'mysql+pymysql://{username}:{password}@{host}:{port}/{database}?charset=utf8'.format(**db_config)
# 创建数据库引擎
engine = create_engine(db_url)
Base = declarative_base(engine)
class User(Base):__tablename__ = 'user'id = Column(Integer,primary_key=True,autoincrement=True)username = Column(String(50),nullable=False)# extend = relationship("UserExtend",uselist=False)def __repr__(self):return "" % self.usernameclass UserExtend(Base):__tablename__ = 'user_extend'id = Column(Integer, primary_key=True, autoincrement=True)school = Column(String(50))uid = Column(Integer,ForeignKey("user.id"))user = relationship("User",backref=backref("extend",uselist=False))Base.metadata.create_all(engine)
from sqlalchemy import create_engine, Column, Integer, String,Enum,ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, sessionmaker, backref# 配置链接数据库信息
db_config = {'host': '127.0.0.1','port': '3306','database': 'mytest1','username': 'root','password': '123456'
}
# 数据库链接地址
db_url = 'mysql+pymysql://{username}:{password}@{host}:{port}/{database}?charset=utf8'.format(**db_config)
# 创建数据库引擎
engine = create_engine(db_url)
Base = declarative_base(engine)
class Author(Base):__tablename__ = 'author'id = Column(Integer, primary_key=True, autoincrement=True)name = Column(String(10), nullable=False)# 关联,默认为一对多,有外键的是多,被引的是一,这个地方写的是类名books = relationship('Book', backref='author')def __repr__(self):return ''.format(self.id, self.name)class Book(Base):__tablename__ = 'book'id = Column(Integer, primary_key=True, autoincrement=True)name = Column(String(20), nullable=False)# 外键,表名.字段名author_id = Column(Integer, ForeignKey('author.id'))# 关联,默认为一对多,有外键的是多,被引的是一,这个地方写的是类名# author = relationship("Author", backref="books")def __repr__(self):return ''.format(self.id, self.name, self.author_id)session = sessionmaker(engine)()
Base.metadata.create_all(engine)