sqlalchemy中让MySQL支持中文字符

engine = create_engine("mysql+pymysql://root:mysql8@localhost/mysqltest?charset=utf8", encoding='utf-8')

数据库:

联表查询:

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,String,Integer
from sqlalchemy.orm import sessionmaker engine = create_engine("mysql+pymysql://root:mysql8@localhost/mysqltest")
Base = declarative_base() class Student(Base):
__tablename__ = 'student'
id = Column(Integer, primary_key=True)
name = Column(String(32))
sex = Column(String(32))
def __repr__(self):
return "%s,%s,%s" %(self.id, self.name, self.sex) class Study_record(Base):
__tablename__ = 'study_record'
id = Column(Integer, primary_key=True)
day = Column(Integer)
status = Column(String(32))
stu_id = Column(Integer)
def __repr__(self):
return "%s,%s,%s" %(self.day, self.status, self.stu_id) Session_class = sessionmaker(bind=engine)
session = Session_class() # select a.*,b.* from a,b where a.id=b.s_id
result = session.query(Student, Study_record).filter(Student.id==Study_record.stu_id).all()
print(result) # [(1,alex,男, 1,YES,1), (1,alex,男, 2,NO,1), (2,jack,男, 1,YES,2), (2,jack,男, 2,YES,2)]
# 此处报错!!有外键关联的时候才能用,而且外键也需要用类映射出来。真TM麻烦!
result1 = session.query(Student).join(Study_record).all()
print(result1)

外键关联之双向反查:

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,String,Integer
from sqlalchemy.orm import sessionmaker,relationship
from sqlalchemy import ForeignKey engine = create_engine("mysql+pymysql://root:mysql8@localhost/mysqltest")
Base = declarative_base() # 学员表student跟考勤表study_record是一对多的关系
class Student(Base):
__tablename__ = 'student'
id = Column(Integer, primary_key=True)
name = Column(String(32))
sex = Column(String(32))
def __repr__(self):
return "%s,%s,%s" %(self.id, self.name, self.sex) class Study_record(Base):
__tablename__ = 'study_record'
id = Column(Integer, primary_key=True)
day = Column(Integer)
status = Column(String(32))
stu_id = Column(Integer, ForeignKey('student.id'))
# 双向反查关系,通过student字段可以看记录对应的学生,反过来通过my_study_record可看学生对应的记录
student = relationship("Student", backref="my_study_record")
def __repr__(self): # self.student.name 这是它的牛逼之处:
return "%s,%s,%s" %(self.day, self.status, self.student.name) Session_class = sessionmaker(bind=engine)
session = Session_class() # 上面加了外键关联,可以用了
result1 = session.query(Student).join(Study_record, isouter=True).all()
print(result1) # [1,alex,男, 2,jack,男, 3,rose,女] alex = session.query(Student).filter(Student.name == 'alex').first()
print(alex) # 1,alex,男
# 如果想查Alex的上课记录咋查呢?在上面加一个双向反查关系
print(alex.my_study_record) # [1,YES,alex, 2,NO,alex]

顾客表有两个外键,两个外键指向同一张表,此时的双向查询:

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,String,Integer
from sqlalchemy.orm import relationship
from sqlalchemy import ForeignKey engine = create_engine("mysql+pymysql://root:mysql8@localhost/mysqltest")
Base = declarative_base() # 顾客表Customer有两个外键,订单地址ID,邮寄地址ID。都关联了同一张表
class Customer(Base):
__tablename__ = 'customer'
id = Column(Integer, primary_key=True)
name = Column(String(32)) bill_addr_id = Column(Integer, ForeignKey("address.id"))
post_addr_id = Column(Integer, ForeignKey("address.id")) bill_addr = relationship("Address", foreign_keys=[bill_addr_id], backref="bill_customers")
post_addr = relationship("Address", foreign_keys=[post_addr_id], backref="post_customers") def __repr__(self):
return "%s" %(self.name) class Address(Base):
__tablename__ = 'address'
id = Column(Integer, primary_key=True)
detail_address = Column(String(32))
def __repr__(self):
return "%s" %(self.detail_address) Base.metadata.create_all(engine)

orms模块

from sqlalchemy.orm import sessionmaker
import orms Session_class = sessionmaker(bind=orms.engine)
session = Session_class()
a1 = orms.Address(detail_address="BeiJing")
a2 = orms.Address(detail_address="ShangHai")
a3 = orms.Address(detail_address="TianJin") session.add_all([a1, a2, a3])
# 注意这里赋值的牛逼之处!!!直接用对象进行赋值
c1 = orms.Customer(name="Alex", bill_addr=a1, post_addr=a2)
c2 = orms.Customer(name="Jack", bill_addr=a2, post_addr=a3)
c3 = orms.Customer(name="Rain", bill_addr=a3, post_addr=a3) session.add_all([c1, c2, c3])
session.commit()

init_data模块

from sqlalchemy.orm import sessionmaker
import orms Session_class = sessionmaker(bind=orms.engine)
session = Session_class() alex = session.query(orms.Customer).filter(orms.Customer.name=="Alex").first()
print(alex.bill_addr, alex.post_addr) # BeiJing ShangHai sh = session.query(orms.Address).filter(orms.Address.detail_address=="ShangHai").first()
print(sh.bill_customers) # [Jack]

多对多映射。book表和author表,和book_author对应关系表。book和author形成多对多关系

建表模块orms

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,String,Integer,Table
from sqlalchemy.orm import relationship
from sqlalchemy import ForeignKey engine = create_engine("mysql+pymysql://root:mysql8@localhost/mysqltest")
Base = declarative_base() # 这个表不会手动管理。用户不操作它就不需要创建类,但是反查的时候需要关联这张表
book_to_author = Table("book_to_author", Base.metadata,
Column("id",Integer,primary_key=True),
Column("book_id",Integer,ForeignKey("book.id")),
Column("author_id",Integer,ForeignKey("author.id"))) class Author(Base):
__tablename__="author"
id = Column(Integer, primary_key=True)
name = Column(String(32), nullable=False) books = relationship('Book',secondary=book_to_author,backref='authors')
def __repr__(self):
return "author_name:%s" %(self.name)
class Book(Base):
__tablename__="book"
id = Column(Integer, primary_key=True)
name = Column(String(32), nullable=False) def __repr__(self):
return "book_name:%s" %(self.name) Base.metadata.create_all(engine)

orms

插入数据模块init_data

from sqlalchemy.orm import sessionmaker
import orms Session_class = sessionmaker(bind=orms.engine)
session = Session_class() b1 = orms.Book(name="Book111")
b2 = orms.Book(name="Book222")
b3 = orms.Book(name="Book333") a1 = orms.Author(name="Alex")
a2 = orms.Author(name="Jack")
a3 = orms.Author(name="Rain") a1.books = [b1, b2]
a2.books = [b2, b3]
a3.books = [b1, b2, b3] session.add_all([a1,a2,a3,b1,b2,b3])
session.commit()

init_data

查询,删除模块

from sqlalchemy.orm import sessionmaker
import orms Session_class = sessionmaker(bind=orms.engine)
session = Session_class()
# 查询Alex的所有书
alex = session.query(orms.Author).filter(orms.Author.name=="Alex").first()
print(alex.books) # [book_name:Book111, book_name:Book222]
# 查询book111的所有作者
book1 = session.query(orms.Book).filter(orms.Book.name=="book111").first()
print(book1.authors) # [author_name:Alex, author_name:Rain]
# alex删除书book1
alex.books.remove(book1)
# 删除Alex作者
session.delete(alex)
session.commit()

sqlalchemy外键的一些东西的更多相关文章

  1. sqlalchemy外键和relationship查询

    前面的文章中讲解了外键的基础知识和操作,上一篇文章讲解了sqlalchemy的基本操作.前面两篇文章都是作为铺垫,为下面的文章打好基础.记得初一时第一次期中考试时考的不好,老爸安慰我说:“学习是一个循 ...

  2. 吃货眼中的sqlalchemy外键和连表查询

    前言 使用数据库一个高效的操作是连表查询,一条查询语句能够查询到多个表的数据.在sqlalchem架构下的数据库连表查询更是十分方便.那么如何连表查询?以及数据库外键对连表查询有没有帮助呢?本篇文章就 ...

  3. sqlalchemy外键关联

    一.创建两张表,并关联外键 导入ForenginKey模块 # -*- coding: UTF-8 -*- from sqlalchemy import create_engine from sqla ...

  4. flask SQLALchemy外键及约束

    from flask import Flask,session from flask_sqlalchemy import SQLAlchemy import config app = Flask(__ ...

  5. pythonのsqlalchemy外键关联查询

    #!/usr/bin/env python import sqlalchemy from sqlalchemy import create_engine from sqlalchemy.ext.dec ...

  6. 【Flask】Sqlalchemy 外键

    ### 外键:使用SQLAlchemy创建外键非常简单.在从表中增加一个字段,指定这个字段外键的是哪个表的哪个字段就可以了.从表中外键的字段,必须和父表的主键字段类型保持一致.示例代码如下: from ...

  7. SQLAlchemy外键的使用

    orm可以将数据库存储的数据封装成对象,同时,如果封装的好的话,所有的数据库操作都可以封装到对象中.这样的代码在组织结构上会非常的清晰,并且相对与使用sql语句在sql注入方面会极具降低. SQLAl ...

  8. sqlalchemy 外键

    建表 from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() from sqlalchemy ...

  9. Python自动化之sqlalchemy复合外键

    复合外键用法 metadata = MetaData(engine) classedu = Table('classedu', metadata, # Column('qq', BigInteger, ...

随机推荐

  1. VM14安装Mas os 13

      工具/原料   VMware Workstation unlocker(for OS X 插件补丁) macOS 10.13镜像 vmware tools 安装前准备   1 下载以上文件: 1. ...

  2. 如何在.NET Core控制台程序中使用依赖注入

    背景介绍 依赖注入(Dependency Injection), 是面向对象编程中的一种设计原则,可以用来减低代码之间的耦合度.在.NET Core MVC中 我们可以在Startup.cs文件的Co ...

  3. Python爬虫入门教程 31-100 36氪(36kr)数据抓取 scrapy

    1. 36氪(36kr)数据----写在前面 今天抓取一个新闻媒体,36kr的文章内容,也是为后面的数据分析做相应的准备的,预计在12月底,爬虫大概写到50篇案例的时刻,将会迎来一个新的内容,系统的数 ...

  4. C++版 - 剑指offer 面试题39:判断平衡二叉树(LeetCode 110. Balanced Binary Tree) 题解

    剑指offer 面试题39:判断平衡二叉树 提交网址:  http://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId= ...

  5. 带着新人学springboot的应用04(springboot+mybatis+redis 完)

    对于缓存也说了比较多了,大家对下图这一堆配置类现在应该有些很粗略的认识了(因为我也就很粗略的认识了一下,哈哈!),咳,那么我们怎么切换这个缓存呢?(就是不用springboot提供的默认的Simple ...

  6. 一篇文章带你学会Linux三剑客之一:awk

    awk是一种用于处理文本.模式匹配的编程语言.与sed和grep,俗称Linux下的三剑客.学会 awk 等于你在 Linux 命令行里,又多了一种处理文本的选择.这篇文章重点教你如何使用,看完这篇文 ...

  7. HashMapd的存取原理你知道多少

    在java的容器集合中,hashmap的使用频率可以说是相当高的.不过对于hashmap的存(put())以及取(get())的原理可能很多人还不大清楚,今天,我就给大家介绍下它是如何存如何取的. # ...

  8. Python的魔法函数

    概要 如何定义一个类 类里通常包含什么 各个部分解释 类是怎么来的 type和object的关系 判断对象的类型 上下文管理器 类结构 #!/usr/bin/env python # -*- codi ...

  9. 环境与工具1:微信群刷屏 | itchat

    在微信群里面,"刷屏"的行为是被谴责的,伴随着"快发红包道歉"与"送飞机票"的出现.那如果小程硬是要做到"刷屏"来验证自 ...

  10. 磊哥测评之数据库SaaS篇:腾讯云控制台、DMC和小程序

    本文由云+社区发表 作者:腾讯云数据库 随着云计算和数据库技术的发展,数据库正在变得越来越强大.数据库的性能如处理速度.对高并发的支持在节节攀升,同时分布式.实时的数据分析.兼容主流数据库等强大的性能 ...