1 基本配置
官方文档:
https://docs.sqlalchemy.org/en/14/orm/session_basics.html#session-querying-20
1.1 Model
from sqlalchemy import INTEGER, Column, ForeignKey, String
from sqlalchemy.orm import declarative_base, relationship
Base = declarative_base()
class Users(Base):
__tablename__ = "users"
uid = Column(INTEGER, primary_key=True)
name = Column(String(30))
age = Column(INTEGER)
class Article(Base):
__tablename__ = "article"
a_id = Column(INTEGER, primary_key=True)
uid = Column(INTEGER)
a_title = Column(String(30))
a_readcount = Column(INTEGER)
1.2 映射
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from model import Base
db_name = "sanic_test"
host = "127.0.0.1"
db_user = "root"
password = "root"
engine = create_engine(f'mysql+pymysql://{db_user}:{password}@{host}/{db_name}', echo=True)
session = sessionmaker(engine)()
Base.metadata.create_all(engine)
session.commit()
1.3 main
from sqlalchemy import create_engine, select
from sqlalchemy.orm import Session
from model import Users, Article
engine = create_engine('mysql://root:root@127.0.0.1/sanic_test?charset=utf8')
session = Session(engine, future=True)
2 数据库
mysql> select * from users;
+-----+--------------+-----+
| uid | name | age |
+-----+--------------+-----+
| 1 | 有勇气的牛排 | 20 |
| 2 | 灰太狼 | 20 |
+-----+--------------+-----+
mysql> select * from article;
+------+-----+---------+-------------+
| a_id | uid | a_title | a_readcount |
+------+-----+---------+-------------+
| 1 | 1 | python | 10 |
| 2 | 1 | java | 30 |
| 3 | 2 | vue | 15 |
+------+-----+---------+-------------+
3 异常处理
with Session(engine) as session:
session.begin()
try:
session.add(some_object)
session.add(some_other_object)
except:
session.rollback()
raise
else:
session.commit()
结合写法
with Session(engine) as session, session.begin():
session.add(some_object)
session.add(some_other_object)
4 使用 sessionmaker
from sqlalchemy.orm import sessionmaker
engine = create_engine('postgresql://scott:tiger@localhost/')
Session = sessionmaker(engine)
3 增加数据
没有的列,自动为空
user1 = Users(name="战神")
user2 = Users(name="战神2", age=18)
session.add(user1)
session.add(user2)
session.commit()
要一次将项目列表添加到会话中,可以使用 Session.add_all()
session.add_all([user1, user2])
4 删除
5 更新
stmt = update(Users).where(Users.uid == 7).values(name="大哥").\
execution_options(synchronize_session="fetch")
result = session.execute(stmt)
execution_options()
:可用于建立执行时间选项
5 查询
5.1 查询单表 多个记录
statement = select(Users).filter_by(age=20)
result = session.execute(statement).scalars().all()
print(result)
for i in result:
print(i)
print(i.id)
print(i.name)
print(i.age)
5.2 查询多表 多个记录
statement = select(Users, Article).where(Users.uid == Article.uid)
result = session.execute(statement).all()
print(result)
for users, article in result:
print(users.uid, article.a_title)
5.3 指定列
statement = select(Users.uid, Users.name, Article).where(Users.uid == Article.uid)
result = session.execute(statement).all()
print(result)
for uid, name, article in result:
print(uid, name, article.a_title)
<h2><a id="1__0"></a>1 基本配置</h2>
<p>官方文档:<br />
https://docs.sqlalchemy.org/en/14/orm/session_basics.html#session-querying-20</p>
<h3><a id="11_Model_3"></a>1.1 Model</h3>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">from</span> sqlalchemy <span class="hljs-keyword">import</span> INTEGER, Column, ForeignKey, String
<span class="hljs-keyword">from</span> sqlalchemy.orm <span class="hljs-keyword">import</span> declarative_base, relationship
Base = declarative_base()
<span class="hljs-keyword">class</span> <span class="hljs-title class_">Users</span>(<span class="hljs-title class_ inherited__">Base</span>):
__tablename__ = <span class="hljs-string">"users"</span>
uid = Column(INTEGER, primary_key=<span class="hljs-literal">True</span>)
name = Column(String(<span class="hljs-number">30</span>))
age = Column(INTEGER)
<span class="hljs-keyword">class</span> <span class="hljs-title class_">Article</span>(<span class="hljs-title class_ inherited__">Base</span>):
__tablename__ = <span class="hljs-string">"article"</span>
a_id = Column(INTEGER, primary_key=<span class="hljs-literal">True</span>)
uid = Column(INTEGER)
a_title = Column(String(<span class="hljs-number">30</span>))
a_readcount = Column(INTEGER)
</code></div></pre>
<h3><a id="12__25"></a>1.2 映射</h3>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">from</span> sqlalchemy <span class="hljs-keyword">import</span> create_engine
<span class="hljs-keyword">from</span> sqlalchemy.orm <span class="hljs-keyword">import</span> sessionmaker
<span class="hljs-keyword">from</span> model <span class="hljs-keyword">import</span> Base
<span class="hljs-comment"># 建立与MySQL的连接</span>
db_name = <span class="hljs-string">"sanic_test"</span>
host = <span class="hljs-string">"127.0.0.1"</span>
db_user = <span class="hljs-string">"root"</span>
password = <span class="hljs-string">"root"</span>
engine = create_engine(<span class="hljs-string">f'mysql+pymysql://<span class="hljs-subst">{db_user}</span>:<span class="hljs-subst">{password}</span>@<span class="hljs-subst">{host}</span>/<span class="hljs-subst">{db_name}</span>'</span>, echo=<span class="hljs-literal">True</span>)
<span class="hljs-comment"># 创建session对象</span>
session = sessionmaker(engine)()
<span class="hljs-comment"># 创建表,执行所有BaseModel类的子类</span>
Base.metadata.create_all(engine)
<span class="hljs-comment"># 提交,必须</span>
session.commit()
</code></div></pre>
<h3><a id="13_main_51"></a>1.3 main</h3>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">from</span> sqlalchemy <span class="hljs-keyword">import</span> create_engine, select
<span class="hljs-keyword">from</span> sqlalchemy.orm <span class="hljs-keyword">import</span> Session
<span class="hljs-keyword">from</span> model <span class="hljs-keyword">import</span> Users, Article
engine = create_engine(<span class="hljs-string">'mysql://root:root@127.0.0.1/sanic_test?charset=utf8'</span>)
session = Session(engine, future=<span class="hljs-literal">True</span>)
</code></div></pre>
<h2><a id="2__62"></a>2 数据库</h2>
<pre><div class="hljs"><code class="lang-python">mysql> select * <span class="hljs-keyword">from</span> users;
+-----+--------------+-----+
| uid | name | age |
+-----+--------------+-----+
| <span class="hljs-number">1</span> | 有勇气的牛排 | <span class="hljs-number">20</span> |
| <span class="hljs-number">2</span> | 灰太狼 | <span class="hljs-number">20</span> |
+-----+--------------+-----+
</code></div></pre>
<pre><div class="hljs"><code class="lang-python">mysql> select * <span class="hljs-keyword">from</span> article;
+------+-----+---------+-------------+
| a_id | uid | a_title | a_readcount |
+------+-----+---------+-------------+
| <span class="hljs-number">1</span> | <span class="hljs-number">1</span> | python | <span class="hljs-number">10</span> |
| <span class="hljs-number">2</span> | <span class="hljs-number">1</span> | java | <span class="hljs-number">30</span> |
| <span class="hljs-number">3</span> | <span class="hljs-number">2</span> | vue | <span class="hljs-number">15</span> |
+------+-----+---------+-------------+
</code></div></pre>
<h2><a id="3__85"></a>3 异常处理</h2>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">with</span> Session(engine) <span class="hljs-keyword">as</span> session:
session.begin()
<span class="hljs-keyword">try</span>:
session.add(some_object)
session.add(some_other_object)
<span class="hljs-keyword">except</span>:
session.rollback()
<span class="hljs-keyword">raise</span>
<span class="hljs-keyword">else</span>:
session.commit()
</code></div></pre>
<p>结合写法</p>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">with</span> Session(engine) <span class="hljs-keyword">as</span> session, session.begin():
session.add(some_object)
session.add(some_other_object)
</code></div></pre>
<h2><a id="4__sessionmaker_107"></a>4 使用 sessionmaker</h2>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">from</span> sqlalchemy.orm <span class="hljs-keyword">import</span> sessionmaker
</code></div></pre>
<pre><div class="hljs"><code class="lang-python">engine = create_engine(<span class="hljs-string">'postgresql://scott:tiger@localhost/'</span>)
<span class="hljs-comment"># a sessionmaker(), also in the same scope as the engine</span>
Session = sessionmaker(engine)
</code></div></pre>
<h2><a id="3__120"></a>3 增加数据</h2>
<p>没有的列,自动为空</p>
<pre><div class="hljs"><code class="lang-python">user1 = Users(name=<span class="hljs-string">"战神"</span>)
user2 = Users(name=<span class="hljs-string">"战神2"</span>, age=<span class="hljs-number">18</span>)
session.add(user1)
session.add(user2)
session.commit()
</code></div></pre>
<p>要一次将项目列表添加到会话中,可以使用 <code>Session.add_all()</code></p>
<pre><div class="hljs"><code class="lang-python">session.add_all([user1, user2])
</code></div></pre>
<h2><a id="4__135"></a>4 删除</h2>
<h2><a id="5__137"></a>5 更新</h2>
<pre><div class="hljs"><code class="lang-python">stmt = update(Users).where(Users.uid == <span class="hljs-number">7</span>).values(name=<span class="hljs-string">"大哥"</span>).\
execution_options(synchronize_session=<span class="hljs-string">"fetch"</span>)
result = session.execute(stmt)
</code></div></pre>
<p><code>execution_options()</code>:可用于建立执行时间选项</p>
<h2><a id="5__147"></a>5 查询</h2>
<h3><a id="51____148"></a>5.1 查询单表 多个记录</h3>
<pre><div class="hljs"><code class="lang-python">statement = select(Users).filter_by(age=<span class="hljs-number">20</span>)
result = session.execute(statement).scalars().<span class="hljs-built_in">all</span>()
<span class="hljs-built_in">print</span>(result)
<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> result:
<span class="hljs-built_in">print</span>(i)
<span class="hljs-built_in">print</span>(i.<span class="hljs-built_in">id</span>)
<span class="hljs-built_in">print</span>(i.name)
<span class="hljs-built_in">print</span>(i.age)
</code></div></pre>
<h3><a id="52____160"></a>5.2 查询多表 多个记录</h3>
<pre><div class="hljs"><code class="lang-python">statement = select(Users, Article).where(Users.uid == Article.uid)
result = session.execute(statement).<span class="hljs-built_in">all</span>()
<span class="hljs-built_in">print</span>(result)
<span class="hljs-keyword">for</span> users, article <span class="hljs-keyword">in</span> result:
<span class="hljs-built_in">print</span>(users.uid, article.a_title)
</code></div></pre>
<h2><a id="53__171"></a>5.3 指定列</h2>
<pre><div class="hljs"><code class="lang-python">statement = select(Users.uid, Users.name, Article).where(Users.uid == Article.uid)
result = session.execute(statement).<span class="hljs-built_in">all</span>()
<span class="hljs-built_in">print</span>(result)
<span class="hljs-keyword">for</span> uid, name, article <span class="hljs-keyword">in</span> result:
<span class="hljs-built_in">print</span>(uid, name, article.a_title)
</code></div></pre>
留言