2018年5月10日笔记

  • 在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:[email protected]/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:[email protected]/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:[email protected]/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 '''

猜你喜欢

转载自www.cnblogs.com/karl-python/p/9027158.html