CREATE DATABASE IF NOTEXISTS test; -- 切换test数据库 USE test; -- 如果存在phone和company表,则删除 DROPTABLE phone IF EXISTS; DROPTABLE company IF EXISTS; -- 创建company表 CREATE TABLE company ( id BIGINTNOT NULL AUTO_INCREMENT, name VARCHAR(20) NOT NULL, country VARCHAR(20) NOT NULL, PRIMARY KEY(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 -- 创建phone表 CREATE TABLE phone ( id BIGINTNOT NULL AUTO_INCREMENT, name VARCHAR(20) NOT NULL, price BIGINTNOT NULL, company_name VARCHAR(20) NOT NULL, PRIMARY KEY(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
-- 插入数据记录 INSERT INTO company(id, name, country) VALUES (1, 'Apple', 'America'); INSERT INTO company(id, name, country) VALUES (2, 'Samsung', 'Korea'); INSERT INTO company(id, name, country) VALUES (3, 'Huawei', 'China'); INSERT INTO company(id, name, country) VALUES (4, 'Xiaomi', 'China'); INSERT INTO company(id, name, country) VALUES (5, 'Vivo', 'China');
INSERT INTO phone(id, name, price, company_name) VALUES (1, 'CC9', 1999, 'Xiaomi') INSERT INTO phone(id, name, price, company_name) VALUES (1, 'Xiaomi9', 2999, 'Xiaomi') -- ok SELECT'OK'AS'Result:';
将数据库中的表映射成类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
classCompany(Base): # 表的名字 __tablename__ = 'company' id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(20)) country = Column(String(20)) classPhone(Base): # 表的名字 __tablename__='phone' # 定义表的结构 id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(20)) price = Column(Integer) company_name = Column(String(20))
外键
关系数据库的多个表可以用外键实现一对多、多对多等关联。但使用外键会降低数据库的查询性能。
例如,如果一个User拥有多个Book,就可以定义一对多关系如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
classUser(Base): __tablename__ = 'user'
id = Column(String(20), primary_key=True) name = Column(String(20)) # 一对多: books = relationship('Book')
classBook(Base): __tablename__ = 'book'
id = Column(String(20), primary_key=True) name = Column(String(20)) # “多”的一方的book表是通过外键关联到user表的: user_id = Column(String(20), ForeignKey('user.id'))