python(十二)下:ORMフレームワークSQLAlchemy使用学習
45535 ワード
本節の内容ORM紹介 sqlalchemyインストール sqlalchemy基本使用 マルチ外部キー関連 多対多関係 表構造設計作業 一、ORM紹介
ライターがpymysqlでプログラムとインタラクティブである場合、オリジナルのsql文を書くのではないでしょうか.複雑なクエリーを行う場合、sql文は少しずつ接続され、再利用性があまりなく、拡張が不便です.また、書かれたsql文は効率的ではなく、プログラムの実行も遅くなる可能性があります.sql文をコードに書くのを避けるために、オリジナルのsqlを直接カプセル化し、オブジェクト向けに操作する方法はありますか?orm(object relational mapping)は、オブジェクトマッピングリレーションシッププログラムであり、簡単に言えばpythonのようなオブジェクト向けのプログラムではすべてオブジェクトであるが、私たちが使用するデータベースはリレーションシップ型であり、一貫した使用習慣を保証するために、ormによってプログラミング言語のオブジェクトモデルとデータベースのリレーションシップモデルをマッピング関係にし、これにより,sql言語を直接使用することなく,プログラミング言語を用いてデータベースを操作する際にプログラミング言語のオブジェクトモデルを直接使用して操作すればよい.
ORMはデータベースもインスタンス化し、コード操作mysqlの中級にormという層を追加することに相当します.ormの利点:は、データアクセスの詳細、「閉じた」汎用データベースインタラクション、ORMのコアを非表示にします.彼は私たちの汎用データベースのインタラクションを簡単に実行しやすくし、このようなSQL文を全く考慮する必要はありません.急速に開発され、そこから来た. ORMは、硬化したデータ構造を構築することを容易にする.
欠点:自動化は、マッピングと関連管理を意味し、パフォーマンスを犠牲にすることを意味します(初期には、ORMが好きではないすべての共通点です).現在の様々なORMフレームワークは、この(LazyLoad,Cache)を軽減するために様々な方法を試みているが、効果は著しい.
二、sqlalchemyインストール
Pythonの中で最も有名なORMフレームワークはSQLAlchemyです.ユーザーにはOpenstack\Dropboxなどの有名な会社やアプリケーションが含まれており、主なユーザーリストhttp://www.sqlalchemy.org/organizations.html#openstack
sqlalchemyのインストール
Centos 7 mariadb-serverのインストール
三、sqlalchemy基本使用
DialectはデータAPIと交流するために用いられ、プロファイルによって異なるデータベースAPIを呼び出し、データベースに対する操作を実現する.
1、テーブルの作成
実行、生成されたsql文を含む関連情報を表示します.
コードの量が少なくなったとは感じていません.焦らないでください.いい芝居は後ろにあります.
上記の作成に加えて、テーブルを作成する方法もあります.
最も基本的なテーブルを作成しましたormでデータを作成してみましょう
2、データを挿入する
こんなにたくさんのコードを書いてやっとデータを作成して、あなたはtmの苦労を表して、振り向いて離れようとして、私はあなたの手を引っ張って離さないで、クライマックスはまだ着いていません.
3.1、照会
この時あなたが見た出力はこのようなはずです.
sqlalchemy返されたデータをオブジェクトにマッピングすると、各フィールドを呼び出すと呼び出しオブジェクトのプロパティと同じになります.like this..
ただし、さっき表示されたメモリオブジェクトのアドレスは、どのようなデータが返されているのかを区別することはできません.具体的なフィールドを印刷して見ない限り、読み取り可能にするには、定義テーブルのクラスの下にこのようなコードを付けるだけです.
すべてのデータを取得
3.2、多条件クエリー
filter_byとfilter
複数条件クエリー
上の2つのfilterの関係はuserに相当する.id >1 AND user.id<7の効果
4、修正
5、ロールバック
6、統計とグループ化
統計count
グループグループグループby
delの削除
7.1、外部キー関連
準備:データを挿入する前にテーブルを作成します.
れんけい
1つ目の例:
外部キー関連付けの実装
作成コマンドを表示できます.
7.2、マルチ外部キー関連
複数の外部キーが関連付けられ、同じテーブルが関連付けられます.次の表では、Customer表の2つのフィールドにAddress表cat orm_が関連付けられています.many_fk.py
正常に書くときは、テーブル構造にモジュールを個別に書きます.データの追加
転載は必ずこの出典を残してください.http://blog.csdn.net/fgf00/article/details/52949973
7.3多対多関係
「図書」と「著者」の関係を説明できる表構造を設計し、需要は1冊の本は何人かの作者が一緒に出版することができます 一人の作者が何冊かの本を書くことができます.この時、前に学んだ外部キーでは上記のニーズを実現できないようですが、どうすればいいですか.このとき、中間表をもう1枚作ればいいので、book_を通過することに相当します.m2m_authorテーブルはbookテーブルとauthorテーブルを完了する前の多対多関連双方向一対多、すなわち多対多である.ormではどのように表示しますか?
複数対複数削除削除削除データの場合boo_m2m_authors,sqlalchemyは自動的に対応するデータを削除します
本を通して作者を削除する
作者を直接削除
作者を削除すると、この作者とすべての本の関連関係データも自動的に削除されます.
8、中国語の問題
データベースの文字セットを先に表示
データベースの文字セットを変更します(文字セットを変更しても中国語が表示されない場合は、指定した試行を作成する必要があります).
データベース指定データベースの文字セットの作成
sqlalchemy接続指定
転載は必ずこの出典を残してください.http://blog.csdn.net/fgf00/article/details/52949973
ライターがpymysqlでプログラムとインタラクティブである場合、オリジナルのsql文を書くのではないでしょうか.複雑なクエリーを行う場合、sql文は少しずつ接続され、再利用性があまりなく、拡張が不便です.また、書かれたsql文は効率的ではなく、プログラムの実行も遅くなる可能性があります.sql文をコードに書くのを避けるために、オリジナルのsqlを直接カプセル化し、オブジェクト向けに操作する方法はありますか?orm(object relational mapping)は、オブジェクトマッピングリレーションシッププログラムであり、簡単に言えばpythonのようなオブジェクト向けのプログラムではすべてオブジェクトであるが、私たちが使用するデータベースはリレーションシップ型であり、一貫した使用習慣を保証するために、ormによってプログラミング言語のオブジェクトモデルとデータベースのリレーションシップモデルをマッピング関係にし、これにより,sql言語を直接使用することなく,プログラミング言語を用いてデータベースを操作する際にプログラミング言語のオブジェクトモデルを直接使用して操作すればよい.
ORMはデータベースもインスタンス化し、コード操作mysqlの中級にormという層を追加することに相当します.ormの利点:
欠点:
二、sqlalchemyインストール
Pythonの中で最も有名なORMフレームワークはSQLAlchemyです.ユーザーにはOpenstack\Dropboxなどの有名な会社やアプリケーションが含まれており、主なユーザーリストhttp://www.sqlalchemy.org/organizations.html#openstack
sqlalchemyのインストール
pip install SQLAlchemy
pip install pymysql
# mysqldb py3, pymysql sqlalchemy
Centos 7 mariadb-serverのインストール
yum -y install mariadb-server #
systemctl start mariadb.service # mysqladmin -uroot -p password # GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY PASSWORD '123456' WITH GRANT OPTION; #
flush privileges;
三、sqlalchemy基本使用
DialectはデータAPIと交流するために用いられ、プロファイルによって異なるデータベースAPIを呼び出し、データベースに対する操作を実現する.
MySQL-Python
mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>
pymysql
mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]
MySQL-Connector
mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>
cx_Oracle
oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]
1、テーブルの作成
import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
# , test
engine = create_engine("mysql+pymysql://root:123456@localhost/test",
encoding='utf-8', echo=True)
# echo=True
Base = declarative_base() # orm
class User(Base):
__tablename__ = 'user' #
id = Column(Integer, primary_key=True)
name = Column(String(32))
password = Column(String(64))
Base.metadata.create_all(engine) # ( )
実行、生成されたsql文を含む関連情報を表示します.
CREATE TABLE user ( id INTEGER NOT NULL AUTO_INCREMENT, name VARCHAR(32), password VARCHAR(64), PRIMARY KEY (id) )
コードの量が少なくなったとは感じていません.焦らないでください.いい芝居は後ろにあります.
上記の作成に加えて、テーブルを作成する方法もあります.
from sqlalchemy import Table, MetaData, Column, Integer, String, ForeignKey
from sqlalchemy.orm import mapper
metadata = MetaData()
user = Table('user', metadata,
Column('id', Integer, primary_key=True),
Column('name', String(50)),
Column('fullname', String(50)),
Column('password', String(12))
)
class User(object):
def __init__(self, name, fullname, password):
self.name = name
self.fullname = fullname
self.password = password
mapper(User, user) # User user
# the table metadata is created separately with the Table construct,
# then associated with the User class via the mapper() function
# , 。
最も基本的なテーブルを作成しましたormでデータを作成してみましょう
2、データを挿入する
from sqlalchemy import create_engine
from sqlalchemy import Table, MetaData, Column, Integer, String
from sqlalchemy.orm import mapper, sessionmaker
# , test
engine = create_engine("mysql+pymysql://root:123456@localhost/test",
encoding='utf-8', echo=True)
metadata = MetaData()
user = Table('user', metadata,
Column('id', Integer, primary_key=True),
Column('name', String(50)),
Column('password', String(12))
)
class User(object):
def __init__(self, name, id, password):
self.id = id
self.name = name
self.password = password
# the table metadata is created separately with the Table construct, then associated with the User class via the mapper() function
mapper(User, user)
# session class , , session class,
Session_class = sessionmaker(bind=engine) # engine
Session = Session_class() # session ,
user_obj = User(id=27,name="fgf",password="123456") #
print(user_obj.name,user_obj.id) # , id None
Session.add(user_obj) # session ,
print(user_obj.name,user_obj.id) #
Session.commit() # ,
こんなにたくさんのコードを書いてやっとデータを作成して、あなたはtmの苦労を表して、振り向いて離れようとして、私はあなたの手を引っ張って離さないで、クライマックスはまだ着いていません.
3.1、照会
my_user = Session.query(User).filter_by(name="fgf").first() #
print(my_user)
この時あなたが見た出力はこのようなはずです.
<__main__.User object at 0x7f0a5a3dea20>
sqlalchemy返されたデータをオブジェクトにマッピングすると、各フィールドを呼び出すと呼び出しオブジェクトのプロパティと同じになります.like this..
print(my_user.id,my_user.name,my_user.password)
#
27 fgf 123456
ただし、さっき表示されたメモリオブジェクトのアドレスは、どのようなデータが返されているのかを区別することはできません.具体的なフィールドを印刷して見ない限り、読み取り可能にするには、定義テーブルのクラスの下にこのようなコードを付けるだけです.
def __repr__(self):
return "<User(name='%s', password='%s')>" % (
self.name, self.password)
from sqlalchemy import create_engine
from sqlalchemy import Table, MetaData, Column, Integer, String
from sqlalchemy.orm import mapper, sessionmaker
# , test
engine = create_engine("mysql+pymysql://root:123456@localhost/test",
encoding='utf-8', echo=True)
metadata = MetaData()
user = Table('user', metadata,
Column('id', Integer, primary_key=True),
Column('name', String(50)),
Column('password', String(12))
)
class User(object):
def __init__(self, name, id, password):
self.id = id
self.name = name
self.password = password
def __repr__(self):
return "<User(name='%s', password='%s')>" % (self.name, self.password)
mapper(User, user)
# session class , , session class,
Session_class = sessionmaker(bind=engine)
Session = Session_class() # session
my_user = Session.query(User).filter_by(name="fgf").first() #
# my_user = Session.query(User).filter_by().all() #
print(my_user)
# print(my_user.id,my_user.name,my_user.password)
# Session.commit() # commit
すべてのデータを取得
print(Session.query(User.name,User.id).all() )
3.2、多条件クエリー
filter_byとfilter
my_user1 = Session.query(User).filter(User.id>2).all()
my_user2 = Session.query(User).filter_by(id=27).all() # filter_by ‘=’
my_user3 = Session.query(User).filter(User.id==27).all() # filter ‘==’
print(my_user1,'
',my_user2,'
',my_user3)
複数条件クエリー
objs = Session.query(User).filter(User.id>0).filter(User.id<7).all()
上の2つのfilterの関係はuserに相当する.id >1 AND user.id<7の効果
4、修正
my_user = Session.query(User).filter_by(name="fgf").first()
my_user.name = "fenggf" #
my_user.passwork = "123qwe"
Session.commit()
5、ロールバック
my_user = Session.query(User).filter_by(id=1).first()
my_user.name = "Jack"
fake_user = User(name='Rain', password='12345')
Session.add(fake_user)
print(Session.query(User).filter(User.name.in_(['Jack','rain'])).all() ) # session
Session.rollback() # rollback
print(Session.query(User).filter(User.name.in_(['Jack','rain'])).all() ) # 。
# Session
# Session.commit()
6、統計とグループ化
統計count
Session.query(User).filter(User.name.like("f%")).count() # mysql
グループグループグループby
from sqlalchemy import func
print(Session.query(User.name,func.count(User.name)).group_by(User.name).all() )
delの削除
7.1、外部キー関連
準備:データを挿入する前にテーブルを作成します.
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker
# , test
engine = create_engine("mysql+pymysql://root:123456@localhost/test",
encoding='utf-8', echo=True)
Base = declarative_base() # orm
class Student(Base):
__tablename__ = 'student' #
id = Column(Integer, primary_key=True, autoincrement=True)
stu_id = Column(Integer)
age = Column(Integer) #
gender = Column(Enum('M','F'),nullable=False)
Base.metadata.create_all(engine) # ( )
# session class , , session class,
Session_class = sessionmaker(bind=engine)
Session = Session_class() # session
stu_obj = Student(stu_id=27, age=22, gender="M")
Session.add(stu_obj)
Session.commit() # ,
れんけい
ret = session.query(Users, Favor).filter(Users.id == Favor.nid).all()
#
ret = session.query(Person).join(Favor).all()
ret = session.query(Person).join(Favor, isouter=True).all()
1つ目の例:
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Enum
from sqlalchemy.orm import sessionmaker
# , test
engine = create_engine("mysql+pymysql://root:123456@localhost/test",
encoding='utf-8')
Base = declarative_base() # orm
class User(Base):
__tablename__ = 'user' #
id = Column(Integer, primary_key=True)
name = Column(String(32))
password = Column(String(64))
def __repr__(self):
return "[%s name:%s]" %(self.id, self.name)
class Student(Base):
__tablename__ = 'student' #
id = Column(Integer, primary_key=True, autoincrement=True)
stu_id = Column(Integer)
age = Column(Integer) #
gender = Column(Enum('M','F'),nullable=False)
def __repr__(self):
return "[%s stu_id:%s sex:%s]" %(self.stu_id, self.age, self.gender)
Session_class = sessionmaker(bind=engine)
Session = Session_class() # session
res = Session.query(User, Student).filter(User.id == Student.stu_id).all()
print(res)
外部キー関連付けの実装
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Enum,DATE,Integer, String,ForeignKey
from sqlalchemy.orm import sessionmaker,relationship
engine = create_engine("mysql+pymysql://root:123456@localhost/test",
encoding='utf-8')
Base = declarative_base() # orm
class Stu2(Base):
__tablename__ = "stu2"
id = Column(Integer, primary_key=True)
name = Column(String(32),nullable=False)
register_date = Column(DATE,nullable=False)
def __repr__(self):
return "<%s name:%s>" % (self.id, self.name)
class StudyRecord(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("stu2.id")) #------ ------
# nb, user backref stu2
stu2 = relationship("Stu2", backref="my_study_record") # , ( )
def __repr__(self):
return "<%s day:%s status:%s>" % (self.stu2.name, self.day,self.status)
Base.metadata.create_all(engine) #
Session_class = sessionmaker(bind=engine) # session class , , session class,
session = Session_class() # session #cursor
s1 = Stu2(name="A",register_date="2014-05-21")
s2 = Stu2(name="J",register_date="2014-03-21")
s3 = Stu2(name="R",register_date="2014-02-21")
s4 = Stu2(name="E",register_date="2013-01-21")
study_obj1 = StudyRecord(day=1,status="YES", stu_id=1)
study_obj2 = StudyRecord(day=2,status="NO", stu_id=1)
study_obj3 = StudyRecord(day=3,status="YES", stu_id=1)
study_obj4 = StudyRecord(day=1,status="YES", stu_id=2)
session.add_all([s1,s2,s3,s4,study_obj1,study_obj2,study_obj3,study_obj4]) #
session.commit()
stu_obj = session.query(Stu2).filter(Stu2.name=="a").first() #
# stu2 , StudyRecord
print(stu_obj.my_study_record) # A
作成コマンドを表示できます.
show create table study_record;
7.2、マルチ外部キー関連
複数の外部キーが関連付けられ、同じテーブルが関連付けられます.次の表では、Customer表の2つのフィールドにAddress表cat orm_が関連付けられています.many_fk.py
from sqlalchemy import Integer, ForeignKey, String, Column
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
from sqlalchemy import create_engine
Base = declarative_base()
class Customer(Base):
__tablename__ = 'customer'
id = Column(Integer, primary_key=True)
name = Column(String(64))
#
billing_address_id = Column(Integer, ForeignKey("address.id"))
shipping_address_id = Column(Integer, ForeignKey("address.id"))
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.street
engine = create_engine("mysql+pymysql://root:123456@localhost/test",
encoding='utf-8')
Base.metadata.create_all(engine) #
MariaDB [test]> show create table customer;
| customer | CREATE TABLE `customer` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(64) DEFAULT NULL,
`billing_address_id` int(11) DEFAULT NULL,
`shipping_address_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `billing_address_id` (`billing_address_id`),
KEY `shipping_address_id` (`shipping_address_id`),
CONSTRAINT `customer_ibfk_1` FOREIGN KEY (`billing_address_id`) REFERENCES `address` (`id`),
CONSTRAINT `customer_ibfk_2` FOREIGN KEY (`shipping_address_id`) REFERENCES `address` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
MariaDB [test]> desc customer;
+---------------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(64) | YES | | NULL | |
| billing_address_id | int(11) | YES | MUL | NULL | |
| shipping_address_id | int(11) | YES | MUL | NULL | |
+---------------------+-------------+------+-----+---------+----------------+
正常に書くときは、テーブル構造にモジュールを個別に書きます.データの追加
import orm_many_fk
from sqlalchemy.orm import sessionmaker
Session_class = sessionmaker(bind=orm_many_fk.engine) # session class , , session class,
session = Session_class() # session #cursor
addr1 = orm_many_fk.Address(street="Tiantongyuan", city="ChangPing", state="BJ")
addr2 = orm_many_fk.Address(street="Wudaokou", city="Haidian", state="BJ")
addr3 = orm_many_fk.Address(street="Yanjiao", city="LangFang", state="HB")
session.add_all([addr1,addr2,addr3])
c1 = orm_many_fk.Customer(name="Fgf", billing_address= addr1,shipping_address=addr2)
c2 = orm_many_fk.Customer(name="Jack", billing_address= addr3,shipping_address=addr3)
session.add_all([c1,c2])
session.commit()
obj = session.query(orm_many_fk.Customer).filter(orm_many_fk.Customer.name=="Fgf").first()
print(obj.name,obj.billing_address,obj.shipping_address) #
転載は必ずこの出典を残してください.http://blog.csdn.net/fgf00/article/details/52949973
7.3多対多関係
「図書」と「著者」の関係を説明できる表構造を設計し、需要は
#
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_engine
from sqlalchemy.orm import sessionmaker
Base = declarative_base()
# 。 ,orm
book_m2m_author = Table('book_m2m_author', Base.metadata,
Column('book_id',Integer,ForeignKey('books.id')),
Column('author_id',Integer,ForeignKey('authors.id')),
)
class Book(Base):
__tablename__ = 'books'
id = Column(Integer,primary_key=True)
name = Column(String(64))
pub_date = Column(DATE)
# book ,
authors = relationship('Author',secondary=book_m2m_author,backref='books')
def __repr__(self):
return self.name
class Author(Base):
__tablename__ = 'authors'
id = Column(Integer, primary_key=True)
name = Column(String(32))
def __repr__(self):
return self.name
engine = create_engine("mysql+pymysql://root:123456@localhost/test",
encoding='utf-8')
Base.metadata.create_all(engine) #
MariaDB [test]> desc book_m2m_author;
+-----------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra | +-----------+---------+------+-----+---------+-------+
| book_id | int(11) | YES | MUL | NULL | | | author_id | int(11) | YES | MUL | NULL | |
+-----------+---------+------+-----+---------+-------+
#
#
import orm_m2m
from sqlalchemy.orm import sessionmaker
Session_class = sessionmaker(bind=orm_m2m.engine) # session class , , session class,
session = Session_class() # session #cursor
#
b1 = orm_m2m.Book(name="learn python with Alex",pub_date="2014-05-2")
b2= orm_m2m.Book(name="learn Zhangbility with Alex",pub_date="2015-05-2")
b3 = orm_m2m.Book(name="Learn hook up girls with Alex",pub_date="2016-05-2")
#
a1 = orm_m2m.Author(name="Alex")
a2 = orm_m2m.Author(name="Jack")
a3 = orm_m2m.Author(name="Rain")
#
b1.authors = [a1,a3]
b3.authors = [a1,a2,a3]
session.add_all([b1,b2,b3,a1,a2,a3])
session.commit()
#
author_obj = session.query(orm_m2m.Author).filter(orm_m2m.Author.name=="alex").first()
print(author_obj.books[0:])
book_obj = session.query(orm_m2m.Book).filter(orm_m2m.Book.id==2).first()
print(book_obj.authors)
複数対複数削除削除削除データの場合boo_m2m_authors,sqlalchemyは自動的に対応するデータを削除します
本を通して作者を削除する
author_obj =s.query(Author).filter_by(name="Jack").first()
book_obj = s.query(Book).filter_by(name=" Alex ").first()
book_obj.authors.remove(author_obj) #
s.commit()
作者を直接削除
作者を削除すると、この作者とすべての本の関連関係データも自動的に削除されます.
author_obj =s.query(Author).filter_by(name="Alex").first()
# print(author_obj.name , author_obj.books)
s.delete(author_obj)
s.commit()
8、中国語の問題
データベースの文字セットを先に表示
MariaDB [test]> show create database test;
+----------+-----------------------------------------------------------------+
| Database | Create Database | +----------+-----------------------------------------------------------------+
| test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET latin1 */ | +----------+-----------------------------------------------------------------+
データベースの文字セットを変更します(文字セットを変更しても中国語が表示されない場合は、指定した試行を作成する必要があります).
MariaDB [test]> alter database test character set utf8;
データベース指定データベースの文字セットの作成
MariaDB [test]> create database mydb character set utf8;
sqlalchemy接続指定
engine = create_engine("mysql+pymysql://root:123456@localhost/test?charset=utf8",)
転載は必ずこの出典を残してください.http://blog.csdn.net/fgf00/article/details/52949973