SqlAlchemy使用教程(四) MetaData 与 SQL Express Language 的使用

这篇具有很好参考价值的文章主要介绍了SqlAlchemy使用教程(四) MetaData 与 SQL Express Language 的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SqlAlchemy使用教程(四) MetaData 与 SQL Express Language 的使用,sql,python,flask,fastapi,pyqt

  • SqlAlchemy使用教程(一) 原理与环境搭建
  • SqlAlchemy使用教程(二) 入门示例及编程步骤
  • SqlAlchemy使用教程(三) CoreAPI访问与操作数据库详解
  • SqlAlchemy使用教程(四) MetaData 与 SQL Express Language 的使用
  • SqlAlchemy使用教程(五) ORM API 编程入门

四、Database MetaData 与 SQL Express Language 的使用

MetaData对象用于描述表结构,SQL Express Language是DBAPI SQL的统一封装器。MetaData 与SQL Express 语句可以在Core层使用,ORM层基于MetaData, SQL Express基础上做了进一步抽象。本章将介绍在Core层如何使用MetaData与SQL Express Language语句。

1、使用MetaData定义表结构

MetaData的含义

  • MetaData 相当于python层的db schema,即数据库结构定义, 用meta.Table对象来表示table 定义,Column对象来表示 column的定义,
  • 通常1个模块只包含1个metaData对象,可以包含多个table定义。

通过MetaData直接定义表结构,这种方式也称为命令式(Imperative),以便于下一章介绍的声明式定义区别开来。 下面介绍每个步骤:

Step-1, 创建1个MetaData对象

from sqlalchemy import MetaData
metadata_obj = MetaData()

Step-2 申明 Table对象

创建了MetaData对象后,就可以用它来声明Table对象,每个字段用Column对象来表示

user_table = Table(
    'user_account',
    metadata_obj,
    Column('id',Integer,primary_key=True),
    Column('name',String(30)),
    Column('speciality',String(30)),
)

说明:

  • user_acount是数据库的table名。
  • user_table 则是meta.Table的实例对象,后面的操作,使用此对象名

必须说明,本例用 metadata 定义表结构的方式,不是ORM 表结构定义方式。

Step-3 Columns 对象

MetaData对象column对象来表示数据库字段,其主要属性

  • name, type object,
  • autoincrement
  • default
  • index
  • info
  • nullable
  • unique
  • primary_key
  • comment
  • insert_sentinel ( 插入执行结果检查)

table对象的 c属性 , 即 table.c
所有列名被放进 table.c数组中,引用列名方式:user_table.c.name

column数据类型
Alchemy 提供了足够的column数据类型,注意类型命名采用CamelCase风格,主要有:
Boolean Integer SmallInteger BigInteger Float Double String
Text Time Date DateTime Enum LargeBinary PickleType等。

Step-4: 定义Primary key、index, foreign key

Primary Key

Column("id", Integer, primary_key=True),

Index

Column(‘Addres’, String, index=True) 

Foreign key

Column("user_id", ForeignKey("user_account.id"), nullable=False),

Step-5: 发送 DDL 指定到数据库创建表

DDL 即create 语句,用MetaData对象的 create_all(),可将该对象上的所有 Table对象转为DDL发送给数据库

metadata_obj.create_all()

此方法会先查询DB中是否存在该表,再进行创建。

MetaData的其它方法

MetaData.tables 返回保存的所有 table 对象列表,

print(meta_obj.tables) 
user_account_tbl = meta_obj.tables['user_account']

删除所有表

meta_obj.drop_all()   

根据已存在数据库反向生成 metadata Table对象

此功能通过 metadata类的reflect() 方法实现。

(1) 读取数据库中所有表结构.
生成的 table 对象保存在 metadata.tables 中。

engine = create_engine("mysql+pymysql://root:123456@127.0.0.1:3306/test_db?charset=utf8")
meta_obj = MetaData() 
meta_obj.reflect(bind=engine) 
school_table = meta_obj.tables[‘school’]

(2) 读取指定表,生成单个table对象

>>> messages = Table("messages", metadata_obj, autoload_with=engine)
>>> [c.name for c in messages.columns]
['message_id', 'message_name', 'date']

(3) 读取有外键字段的表
如果读取数据库表时,如果该表存在外键字段, 加载时,会自动加载关联表
shopping_cart_items 外键字段引用了shopping_cards, 也被加载了

>>> shopping_cart_items = Table("shopping_cart_items", metadata_obj, autoload_with=engine)
>>> "shopping_carts" in metadata_obj.tables
True

2、SQL Express Language (SQL表达式)

SQL表达式位于Core 层,但其可以通过Core API 使用,也可以被ORM使用,只是在ORM层,数据的添加、修改、删除是通过ORM对象+Session操作完成,只有查询是通过SQL表达式。
在第2章中,介绍了通过econnect对象直接执行SQL语句,而下面介绍的SQL表达式是基于metadata,对SQL做了封装,如数据库对象是通过metadata中的Table类对象来表示,表字段保存在table.c结构中,并提供了select(), insert(), update(), delet()等方法,以及where(), join(), order_by()等辅助方法来完成sql操作。

2.1 NSERT() 方法

Insert 单条数据 :

with engine.connect() as conn: 
    stmt = insert(asset_table).values(name="打印机",tag="A0001",value=3000,user_id=1)
    result = conn.execute(stmt)
    conn.commit()
    print(result.inserted_primary_key)

判断插入结果 result 是否成功,
通过检查 result.inserted_primary_key, 如果为None表示插入失败。

插入多条数据

with engine.connect() as conn:     
    # send many statements 
    rows = [
        {'name':'复印机','tag': 'A0002', 'value': 29000, 'user_id': 4 },
        {'name':'20吨吊车','tag': 'D0001', 'value': 240000, 'user_id': 1 },
    ]
    conn.execute( asset_table.insert(), rows )
    conn.commit()

2.2 Select()方法

基本使用方法

from sqlalchemy import select
stmt = select(user_table).where(user_table.c.name == "spongebob")
print(stmt)
with Session(engine) as session:
     for row in session.execute(stmt):
         print(row)

选择部分字段:

select(user_table.c.name, user_table.c.fullname))

修改列名,

from sqlalchemy import func, cast
stmt = select(("Username: " + user_table.c.name).label("username"),).order_by(user_table.c.name)
with engine.connect() as conn:
    for row in conn.execute(stmt):
         print(f"{row.username}")

output

Username: 张锋
Username: 海绵宝宝
Username: 王小乙

Where 子句

select(user_table).where(user_table.c.name == "squidward"))
>>> print(
...     select(address_table.c.email_address)
...     .where(user_table.c.name == "squidward")
...     .where(address_table.c.user_id == user_table.c.id)
... )

相当于SQL

SELECT address.email_address
FROM address, user_account
WHERE user_account.name = :name_1 AND address.user_id = user_account.id

join 联合查询

>>> print(
...     select(address_table.c.email_address)
...     .select_from(user_table)
...     .join(address_table, user_table.c.id == address_table.c.user_id)
... )
SELECT address.email_address
FROM user_account JOIN address ON user_account.id = address.user_id

2.3 数据更新update()与删除 Delete()

1) 更新数据

方法: Update()

stmt = update(user_table).values(fullname="Username: " + user_table.c.name)

更新多条数据 示例 :

>>> from sqlalchemy import bindparam
>>> stmt = (
...     update(user_table)
...     .where(user_table.c.name == bindparam("oldname"))
...     .values(name=bindparam("newname"))
... )
>>> with engine.begin() as conn:
...     conn.execute(
...         stmt,
...         [
...             {"oldname": "jack", "newname": "ed"},
...             {"oldname": "wendy", "newname": "mary"},
...             {"oldname": "jim", "newname": "jake"},
...         ],
...     )

有外键数据更新

>>> scalar_subq = (
...     select(address_table.c.email_address)
...     .where(address_table.c.user_id == user_table.c.id)
...     .order_by(address_table.c.id)
...     .limit(1)
...     .scalar_subquery()
... )
>>> update_stmt = update(user_table).values(fullname=scalar_subq)
>>> print(update_stmt)
2) 删除数据

主法: delete()

示例:

from sqlalchemy import delete
stmt = (
    delete(user_table).
    where(user_table.c.id == 5)
)
result = conn.execute(stmt) 

Delete操作返回值类型为 CursorResult,可以用 result.rowcount 查看受影响行数,以确定是否成功。

多表删除:文章来源地址https://www.toymoban.com/news/detail-794161.html

delete_stmt = (
     delete(user_table)
     .where(user_table.c.id == address_table.c.user_id)
     .where(address_table.c.email_address == "patrick@aol.com")
)
from sqlalchemy.dialects import mysql
print(delete_stmt.compile(dialect=mysql.dialect()))

DELETE FROM user_account USING user_account, address
WHERE user_account.id = address.user_id AND address.email_address = %s

到了这里,关于SqlAlchemy使用教程(四) MetaData 与 SQL Express Language 的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SQL Server Express 自动备份方案

    对于许多小型企业和个人开发者来说,SQL Server Express是一个经济实惠且强大的数据库解决方案。然而,就像任何其他关键数据一样,对其进行定期备份是至关重要的。虽然 Enterprise 版本自动备份功能,无奈小项目还是用不

    2024年02月12日
    浏览(33)
  • flask---》更多查询方式/连表查询/原生sql(django-orm如何执行原生sql)/flask-sqlalchemy

    sqlalchemy执行原生sql django执行原生sql

    2024年02月13日
    浏览(38)
  • 【学习笔记-SQL必知必会】Microsoft SQL Server Express和SQL Server Management Studio安装

    为了实现书中的SQL查询,需要使用一个数据库管理系统(DBMS),在其上进行操作,按书中介绍: Windows 用户可以使用Microsoft SQL Server Express,这是强大的SQL Server 的一个免费版本,它还包括一个用户友好的客户端叫SQL Server Management Studio。 所以这里对Microsoft SQL Server Express和SQ

    2024年02月05日
    浏览(57)
  • LabVIEW与SQL Server 2919 Express通讯

    LabVIEW与SQL Server 2919 Express通讯 ​LabVIEW与数据库通讯,可以使用数据库连接工具包。一般小型数据库用Access就可以了。但是对于长时间,需要存储空间较大的场合,Access一般不超过2G。这样就需要更换其他数据了。 SQL Server不同版本存储数据大小也不相同,考虑到可免费使用

    2024年02月05日
    浏览(31)
  • Microsoft SQL Server 2008 R2 Express

    支持开发的 Express 核心版本。包括 SQL Server 2008 数据库引擎和 SQL Server Management Studio Express SQL Server 2008 R2 Express with Tools SQL Server 2008 R2 Express with Advanced Services 扩展 SQL Server 2008 Express with Tools 以包括对集成的全文搜索和 Reporting Services 的支持 SQL Server 2008 R2 Express (仅运行时) 只

    2024年02月09日
    浏览(57)
  • SQL(Structured Query Language)简介和常见 SQL 命令示例

    SQL(Structured Query Language)是一种用于访问和操作关系型数据库的标准语言。它是一个功能强大的语言,用于执行各种数据库操作,包括检索数据、插入新记录、更新记录、删除记录、创建数据库、创建新表、设置权限以及执行存储过程和视图等。以下是 SQL 的一些重要方面:

    2024年02月05日
    浏览(50)
  • 在Docker上安装部署SQL Server2019 Express

    1.从 Microsoft 容器注册表中提取 SQL Server 2019 Linux 容器镜像。 2.创建目录 当Docker容器删除后,容器里面的数据会随之被清空,所以我们需要通过挂载宿主机磁盘目录,来永久存储数据。执行以下指令创建存储数据库文件的目录。 3.修改目录权限 由于容器没有权限访问外部目录

    2024年02月11日
    浏览(49)
  • 【Express.js】sql-knex 增删改查

    本节使用knex作为sql框架,以sqlite数据库为例 knex是一个运行在各自数据库Driver上的框架,因此需要安装相应的js版数据库Driver,如: PostgreSQL - pg, mysql/mariadb - mysql, sqlite - sqlite3… 安装sqlite3依赖 npm install sqlite3 安装knex依赖 npm install knex 引入依赖 建议安装一款合适的数据库界面工

    2024年02月09日
    浏览(31)
  • Hive 中执行 SQL语句 报错 :FAILED: SemanticException org.apache.hadoop.hive.ql.metadata.HiveException: java.

    在命令输入 hive 启动后: 解决方案: **错误原因:**服务端未开启服务,在hive服务端使用命令:hive --service metastore 然后再启动hive , 就可以正常使用sql语句了。 **其他原因:**有的是mysql没有启动,下面有完整的hive 启动流程 启动hive 流程(很多问题往往是少了步骤导致的)

    2024年02月15日
    浏览(53)
  • SQL server2019 Express安装及脱机安装 microsoft机器学习服务器组件

    安装包下载地址: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 说明 :如果提示失败,自行百度处理,处理不了重装系统

    2024年02月05日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包