1. 程式人生 > >2018年5月10日筆記

2018年5月10日筆記

conn imp key port 學生 但是 not oot mysql

  • 在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 ‘‘‘

2018年5月10日筆記