- 在Python中如何表示数据库表
方法一:由于数据库表是一个二维表,所以可用list表示多行,list的每个元素是tuple,表示一行记录
如:有一张学生信息表,包含学生的学号,姓名,年龄,可表示如下:
[ (1001, "Tom", 18), (1002, "Jack", 20), (1003, "Karl", 24) ]
方法二:但tuple表示一行很难看出表的结构,用class实例表示一行记录,能更好的了解表结构
如:用一个Student类中的属性来表示表的字段,用一个Student实例来表示一个学生的信息,如下:
class Student(object): def __init__(self, id, name, age): self.id = id self.name = name self.age = age [ Student(1001, "Tom", 18), Student(1002, "Jack", 20), Student(1003, "Karl", 24) ]
- ORM技术
ORM:Object-Relational Mapping,把关系数据库的表结构映射到对象上,这就是ORM技术。
但是由谁来做这个转换呢? 因此ORM框架应运而生。
在Python中,最有名的ORM框架是SQLAlchemy。
- 例题1:定义一个Student类来表示Student表
1 # 每张表用一个类表示 2 # 表的字段和类的属性是意义对应的 3 4 class Student(object): 5 def __init__(self, id, name, age): 6 self.id = id 7 self.name = name 8 self.age = age 9 10 student1 = Student(1001, "Tom", 18) 11 print(student1) 12 print(student1.id) 13 print(student1.name) 14 print(student1.age)
<__main__.Student object at 0x10214fcc0> 1001 Tom 18
- 例题2:使用sqlalchemy模块来连接mysql数据库并定义一张studnet表的表结构
1 from sqlalchemy import create_engine 2 import pymysql 3 4 engine = create_engine("mysql+pymysql://root:password@47.98.132.77/sqlalchemy") 5 print(engine) 6 sql = '''create table student( 7 id int not null PRIMARY KEY, 8 name varchar(100), 9 age int);''' 10 11 cus = engine.connect() 12 cus.execute(sql) 13 cus.close()
- 例题3:使用sqlalchemy模块中预定义的方法代替SQL语句,完成表结构的定义
1 import pymysql 2 from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String 3 4 engine = create_engine("mysql+pymysql://root:Karl~612500@47.98.132.77/sqlalchemy") 5 metadata = MetaData(engine) 6 7 teacher = Table("teacher", metadata, 8 Column("id", Integer, primary_key=True), 9 Column("name", String(100)), 10 Column("age", Integer) 11 ) 12 metadata.create_all(engine)
- 例题4:使用ORM的思想,来新建一张student表
1 from sqlalchemy import create_engine, Column, Integer, String 2 from sqlalchemy.ext.declarative import declarative_base 3 from sqlalchemy.orm import sessionmaker 4 5 engine = create_engine("mysql+pymysql://root:password@47.98.132.77/sqlalchemy") 6 DBsession = sessionmaker(bind=engine) 7 session = DBsession() 8 9 Base = declarative_base() 10 11 class Student(Base): 12 __tablename__ = "student" 13 id = Column(Integer, primary_key=True) 14 name = Column(String(100)) 15 age = Column(Integer) 16 17 std1 = Student(id=2001, name="Tom", age=30) 18 std2 = Student(id=2002, name="Helen", age=26) 19 std3 = Student(id=2003, name="Rose", age=19) 20 21 session.add_all([std1, std2,std3]) 22 session.commit() 23 24 a = session.query(Student).filter(Student.id>2001).all() 25 print(a) 26 for i in a: 27 print(i.id) 28 print(i.name) 29 print(i.age) 30 31 session.close() 32 33 ''' 34 filter和filter_by的区别: 35 filter_by(name="Karl) -> 可直接使用属性名,不能使用> < 36 filter(Student.id>2001) -> 需使用类名.属性名,能使用> < 37 '''