【python】-- pymsql 外键
生活随笔
收集整理的這篇文章主要介紹了
【python】-- pymsql 外键
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?pymsql 外鍵
本片是以上一篇pymsql操作MySQL的補充,主要演示pymysql的外鍵操作使用
?
一、一對一外鍵關聯
1、示意圖
2、一對一外鍵關聯示例
2.1、創建表結構,插入數據
from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, DATE, ForeignKey from sqlalchemy.orm import relationship, sessionmakerconnect = create_engine("mysql+pymysql://root:123456@localhost:3306/test",encoding="utf-8",echo=False) # 連接數據庫,echo=True =>把所有的信息都打印出來Base = declarative_base() # 生成ORM基類class Student(Base): # 學生表__tablename__ = "student"id = Column(Integer, primary_key=True)name = Column(String(32), nullable=False)register_date = Column(DATE, nullable=False)def __repr__(self):return "<{0} name:{1}>".format(self.id, self.name)class StudentRecord(Base): # 學生學習記錄表__tablename__ = "study_record"id = Column(Integer, primary_key=True)day = Column(Integer, nullable=False)status = Column(String(32), nullable=False)stu_id = Column(Integer, ForeignKey("student.id")) # 關聯外鍵#關聯student表,然后我需要在study_record里通過student這個字段,就可以去查Student類里面所有的字段,# 反過來利用backref="my_study_record"中的my_study_record,在student表里通過my_study_record這個字段反查study_record類里面的所有字段,Student = relationship("Student", backref="my_study_record")def __repr__(self):return "<name:{0} day:{1} stu_id:{2}>".format(self.Student.name, self.day, self.stu_id)Base.metadata.create_all(connect) # 創建學生表和學生記錄表,在第一次創建后注釋session_class = sessionmaker(connect) # 創建與數據庫的會話session class ,這里返回給session的是個class,不是實例 session = session_class() # 生成session實例#在兩個表中插入數據 stu1 = Student(name="test", register_date="2017-05-30") stu2 = Student(name="test2", register_date="2017-06-30") record1 = StudentRecord(day=1, status="Y", stu_id=1) record2 = StudentRecord(day=2, status="Y", stu_id=1) session.add_all([record1, record2]) session.commit()2.2、根據關聯外鍵,查對應表中信息
stu_obj = session.query(Student).filter_by(name="test").first() print(stu_obj.my_study_record) # 在學生表里查學生對應的學習記錄record_obj = session.query(StudentRecord).first() print(record_obj.Student.name) # 在學生記錄表里面查學習記錄對應學生的名字#輸出 [<name:test day:1 stu_id:1>, <name:test day:2 stu_id:1>]test?
?
二、一對多外鍵關聯
案例一創建的是:一對一的外鍵關系,現在是一對多的外鍵關系
1、一對多外鍵關聯示例:
1.1、創建表結構
from sqlalchemy import Integer, ForeignKey, String, Column from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship from sqlalchemy import create_engineBase = declarative_base() # orm基類class Customer(Base): # 消費者表__tablename__ = "customer"id = Column(Integer, primary_key=True)name = Column(String(64))#創建兩個外鍵,都指向address.idbilling_address_id = Column(Integer, ForeignKey("address.id"))shipping_address_id = Column(Integer, ForeignKey("address.id"))#因為有兩個外鍵,需要通過foreign_keys=[外鍵字段]告訴sqlalchemy關聯哪個外鍵了,不然就會報錯billing_address = relationship("Address", foreign_keys=[billing_address_id])shipping_address = relationship("Address", foreign_keys=[shipping_address_id])class Address(Base): # 收貨地址表__tablename__ = "address"id = Column(Integer, primary_key=True)street = Column(String(64))city = Column(String(64))state = Column(String(64))def __repr__(self):return self.state + "-" + self.city + "-" + self.streetconnect = create_engine("mysql+pymysql://root:123456@localhost:3306/test",encoding="utf-8",echo=False) # 連接數據庫,echo=True =>把所有的信息都打印出來Base.metadata.create_all(connect) # 創建所有的表1.2、插入數據(默認規則創建數據表結構在一個.py文件,增刪查改等操作不與表結構.py文件在一起)
import many_foreign_key # 導出表結構創建模塊 from sqlalchemy.orm import sessionmaker#創建session與數據庫會話類,生成session實例 session_class = sessionmaker(bind=many_foreign_key.connect) session = session_class() #創建address address1 = many_foreign_key.Address(street="nanshanqu", city="shenzhen", state="guangdong") address2 = many_foreign_key.Address(street="baoanqu", city="shenzhen", state="guangdong") #創建consumers c1 = many_foreign_key.Customer(name="test", billing_address=address1, shipping_address=address1) c2 = many_foreign_key.Customer(name="test1", billing_address=address2, shipping_address=address1) #添加session提交 session.add_all([address1, address2, c1, c2]) session.commit()1.3、查詢數據
import many_foreign_key from sqlalchemy.orm import sessionmakerobj = session.query(many_foreign_key.Customer).filter_by(name="test1").first() print(obj.name, obj.billing_address, obj.shipping_address)#輸出 test1 guangdong-shenzhen-baoanqu guangdong-shenzhen-nanshanqu?
?
三、多對多外鍵關聯
通過數據庫模擬設計“圖書”與“作者”的關系的表結構,從而來演示多對多外鍵關聯:
1、多對多外鍵關聯示例:
1.1、創建表結構
from sqlalchemy import Table, Column, Integer, String, DATE, ForeignKey from sqlalchemy.orm import relationship from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import create_engineBase = declarative_base() # 創建orm基類# 創建一張中間表,用于對book表和author表之前的多對多關聯, 中間表建立后由ORM自動維護 book_m2m_author = Table("book_m2m_author", Base.metadata,Column("id", Integer, primary_key=True),Column('books_id', Integer, ForeignKey("books.id")),Column('authors_id', Integer, ForeignKey("authors.id")))class Book(Base):__tablename__ = "books"id = Column(Integer, primary_key=True)name = Column(String(64))pub_date = Column(DATE)#關聯authors表和中間表book_m2m_author,即可通過books反查出Author表中的數據或者#通過authors反查出books表中的數據authors = relationship("Author", secondary=book_m2m_author, backref="books")def __repr__(self):return self.nameclass Author(Base):__tablename__ = "authors"id = Column(Integer,primary_key=True)name = Column(String(32))def __repr__(self):return self.nameconnect = create_engine("mysql+pymysql://root:123456@localhost:3306/test?charset=utf8",echo=False) # 連接數據庫,echo=True =>把所有的信息都打印出來Base.metadata.create_all(connect) # 創建所有表數據關聯示意圖:
1.2、插入數據
import m2m_foreign_key from sqlalchemy.orm import sessionmaker#創建session與數據庫會話類,生成session實例 session_class = sessionmaker(bind=m2m_foreign_key.connect) session = session_class() #創建book信息 b1 = m2m_foreign_key.Book(name="Python", pub_date="2017-08-08") b2 = m2m_foreign_key.Book(name="JAVA", pub_date="2017-10-08") b3 = m2m_foreign_key.Book(name="C", pub_date="2017-11-08") #創建author信息 a1 = m2m_foreign_key.Author(name="test") a2 = m2m_foreign_key.Author(name="test1") a3 = m2m_foreign_key.Author(name="test2") #創建中間表信息 b1.authors = [a1, a3] b2.authors = [a1, a2, a3]session.add_all([b1, b2, b3, a1, a2, a3])session.commit()1.3、查詢數據
import m2m_foreign_key from sqlalchemy.orm import sessionmaker#創建session與數據庫會話類,生成session實例 session_class = sessionmaker(bind=m2m_foreign_key.connect) session = session_class()authors_obj = session.query(m2m_foreign_key.Author).filter_by(name="test").first() print(authors_obj.books) # 通過books反查出books表中的數據 book_obj = session.query(m2m_foreign_key.Book).filter(m2m_foreign_key.Book.id == 2).first() print(book_obj.authors) # 通過authors反查出authors表中的數據 #輸出 [Python, JAVA] [test, test1, test2]1.4、刪除數據
刪除數據時不用管book_m2m_authors , sqlalchemy會自動幫你把對應的數據刪除
import m2m_foreign_key from sqlalchemy.orm import sessionmaker#創建session與數據庫會話類,生成session實例 session_class = sessionmaker(bind=m2m_foreign_key.connect) session = session_class()#通過書刪除作者 author_obj = session.query(m2m_foreign_key.Author).filter_by(name="test1").first() book_obj = session.query(m2m_foreign_key.Book).filter_by(name="JAVA").first() book_obj.authors.remove(author_obj) # 從一本書里刪除一個作者 session.commit()#刪除作者,會把這個作者跟所有書的關聯關系數據也自動刪除 author_obj =session.query(m2m_foreign_key.Author).filter_by(name="test").first() # print(author_obj.name , author_obj.books) s.delete(author_obj) s.commit()?
?
注:處理中文
sqlalchemy設置編碼字符集一定要在數據庫訪問的URL上增加charset=utf8,否則數據庫的連接就不是utf8的編碼格式
eng = create_engine('mysql://root:root@localhost:3306/test2?charset=utf8',echo=True)
?
轉載于:https://www.cnblogs.com/Keep-Ambition/p/8094151.html
總結
以上是生活随笔為你收集整理的【python】-- pymsql 外键的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jmeter将响应结果由Unicode转
- 下一篇: sed实例(持续更新)