2018年5月10日筆記
阿新 • • 發佈:2018-05-12
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日筆記