关于sqlalchemy映射数据库里面的表,一般情况下我们是需要定义一个模型来映射数据库里面的表的。但是很多时候数据库里面的表都是定义好的,而且字段很多,那么有没有不定义模型,还能使用orm语法查找数据的方法呢?

显然是可以的,下面我们就来试一下,首先在我本地的数据库一共有两张表,一张表叫做girls,另一张叫做info。

# -*- coding:utf-8 -*-
# @Author: WanMingZhu
# @Date: 2019/8/13 11:32
from sqlalchemy import MetaData
from sqlalchemy import create_engine
from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import sessionmaker # 定义引擎,不用说
engine = create_engine("postgresql://postgres:zgghyys123@localhost:5432/postgres")
# 绑定引擎,生成一个MetaData对象
metadata = MetaData(bind=engine)
# 通过engine将tables反射到meta上,指定schema,这里就是public,public的话在postgresql里面不需要指定,默认的
# only参数则是提取我们指定的表
metadata.reflect(engine, only=["girls"], schema="public")
# 调用automap_base,传入metadata,从名字也能看出来,自动映射成类
# 将metadata里面保存的表信息映射成Base
Base = automap_base(metadata=metadata)
# 调用prepare方法,设置被映射的类和关系
Base.prepare() # 然后数据库里里面的表都被映射类之后,被保存在Base.classes下面,直接通过Base.classes.表名 即可得到模型
# 比如我们的是girls表,那么获取对应的类,就可以使用Base.classes.girls,我们起名为Girls
# 这个Girls和我们使用class Girls(Base):这种以前使用的方式得到的Girls是一样的
# 只不过我们以前是先定义模型然后映射成表,这里是由表反过来推出模型
Girls = Base.classes.girls # 那么就可以创建session了
# 创建session的方式还是和以前一样,没什么区别
Session = sessionmaker()
session = Session(bind=engine) # 查询
res = session.query(Girls).first()
print(res.id, res.name, res.age, res.gender) # 6 芙兰朵露斯卡雷特 495 女

但是如果表比较多的话,我们也可以不指定only,那么就会获取全部的表

# -*- coding:utf-8 -*-
# @Author: WanMingZhu
# @Date: 2019/8/13 11:32
from sqlalchemy import MetaData
from sqlalchemy import create_engine
from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import sessionmaker engine = create_engine("postgresql://postgres:zgghyys123@localhost:5432/postgres")
metadata = MetaData(bind=engine)
# 不指定only
metadata.reflect(engine, schema="public")
Base = automap_base(metadata=metadata)
Base.prepare() # 此时的Base.classes则是储存了数据库里面所有的表对应的模型
Info = Base.classes.info Session = sessionmaker()
session = Session(bind=engine) res = session.query(Info).first()
print(res.id, res.anime, res.boyfriend) # 2 樱花庄的宠物女孩 神田空太

当然我们定义模型的方法,也可以进行大量的简化

# -*- coding:utf-8 -*-
# @Author: WanMingZhu
# @Date: 2019/8/13 13:19
from sqlalchemy import MetaData
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy import Table engine = create_engine("postgresql://xxxxx:xxxxxxxWdas123213213?@1xxxxxxxxxxx:xxxx/xxxxx")
Base = declarative_base(bind=engine)
metadata = MetaData(bind=engine)
metadata.reflect(engine, schema="th") class Fucker(Base):
# 以前指定__tablename__ = "staff"
# 这里指定__table__ = Table("staff", metadata, autoload=True)
__table__ = Table("staff", metadata, autoload=True, schema="th") Session = sessionmaker(bind=engine)
session = Session() for res in session.query(Fucker)[: 10]:
print(res.name, res.oid, res.id, res.post)
"""
aaa 021310 01010003703 xhg
bbb 021310 01010009076 xhg
ccc 021310 01010003624 xhg
ddd 220002 01010002897 xhg
eee 021310 01010003028 xhg
fff 150002 01010003089 xhg
ggg 150002 01010008497 xhg
hhh 150002 01010003919 xhg
iii 021310 01010009096 xhg
jjj 01- 01010002871 xhg
"""

但是这种方式不推荐,不仅没有第一种方法简洁,而且会弹出警告,至于警告是什么,没看源码,目前还不清楚。但是上面的方法是绝对没有问题的,效率还高。只是数据库里面的表多了,记得加上only参数,因为不加的话,会映射所有的表

如何使用sqlalchemy判断当前数据库的某个schema下是否存在某张表,以及查询当前schema下的所有表有哪些

from sqlalchemy import create_engine

engine = create_engine("postgresql://xxxxxxxx:Qxxxxxxxxxxxxxx3?@1xxxdasdsa2dxxxxxs2xx:xxxx3/mxxxxx")
print(engine.has_table(table_name="staff", schema="th")) # True all_tables = engine.table_names(schema="th") # True
print(all_tables)
"""
['staff', 'hahaha', 'gagaga']
"""
print("staff" in all_tables) # True

如何使用sqlalchemy根据数据库里面的表反推出模型,然后进行查询的更多相关文章

  1. sqlalchemy的数据库ORM操作(表之间的关系)

    首先导入一些需要的东东 ,我是在flask中写的,也可以用纯python去写. from flask import Flask from sqlalchemy import create_engine ...

  2. MySQL 判断数据库和数据表是否存在

    MySQL 判断数据库和数据表是否存在 如何使用SQL查询语句,判断数据库和数据表是否存在? 1.判断数据库是否存在 查询SQL如下: select * from information_schema ...

  3. pandas 读mysql数据库(整个表或者表的指定列)

    问题1:如何从数据库中读取整个表数据到DataFrame中? 首先,来看很容易想到的的办法 def read_table_by_name(self, table_name): "" ...

  4. 04:sqlalchemy操作数据库

    目录: 1.1 ORM介绍(作用:不用原生SQL语句对数据库操作) 1.2 安装sqlalchemy并创建表 1.3 使用sqlalchemy对表基本操作 1.4 一对多外键关联 1.5 sqlalc ...

  5. Python3.x:SQLAlchemy操作数据库

    Python3.x:SQLAlchemy操作数据库 前言 SQLAlchemy是一个ORM框架(Object Rational Mapping,对象关系映射),它可以帮助我们更加优雅.更加高效的实现数 ...

  6. SQLAlchemy基本使用,创建表,增删改查

    基础语法 创建连接 from sqlalchemy import create_engine # 写法1 engine = create_engine("postgresql://scott ...

  7. sqlalchemy模块介绍、单表操作、一对多表操作、多对多表操作、flask集成.

    今日内容概要 sqlalchemy介绍和快速使用 单表操作增删查改 一对多 多对多 flask集成 内容详细 1.sqlalchemy介绍和快速使用 # SQLAlchemy是一个基于 Python实 ...

  8. 分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)

    分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...

  9. Sybase数据库,普通表修改分区表步骤

    本文目标:指导项目侧人员再遇到此类改动需求时可以自己参照更改.需求:Sybase数据库,普通表t_jingyu修改为按天分区的分区表. 1.sp_help查看t_jingyu的表结构,索引等信息 sp ...

随机推荐

  1. mac 安装photoshop + 破解

    项目开发中毫无疑问会用到图片,一般情况都是UI将图片切好的,只是,有时候项目中少了一张图片或者是改变图片的尺寸之类的问题,这里我们就不需要每次都找UI要图片了,作为程序员这些基础工具的使用,咱们还是要 ...

  2. pyQt点击事件和数据传输

    首先是PushButton点击事件,点击按钮之后发送textEdit框里输入的文字到后台. def retranslateUi(self, MainWindow): _translate = QtCo ...

  3. java:工具(汉语转拼音,压缩包,EXCEL,JFrame窗口和文件选择器,SFTP上传下载,FTP工具类,SSH)

    1.汉语转拼音: import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pinyin4j.format.HanyuP ...

  4. 1004: [递归]母牛的故事(python):(本地测试正确;但提交不对!!??)求教

    时间限制: 1Sec 内存限制: 128MB 提交: 28438 解决: 8320 题目描述 有一头母牛,它每年年初生一头小母牛.每头小母牛从第四个年头开始,每年年初也生一头小母牛.请编程实现在第n年 ...

  5. windows下sqlplus怎么连接远程oracle

    语法:sqlplus usr/pwd@//host:port/sid [oracle@mzl ~]$ sqlplus system/51411482@//192.168.21.11:1521/orcl ...

  6. react 添加代理 proxy

    react package.json中proxy的配置如下 "proxy": { "/api/rjwl": { "target": &quo ...

  7. GO-REDIS的一些高级用法

    1. 前言 说到Golang的Redis库,用到最多的恐怕是redigo 和 go-redis.其中 redigo 不支持对集群的访问.本文想聊聊go-redis 2个高级用法 2. 开启对Clust ...

  8. ES5与ES6常用语法教程之 ③模板字符串、判断字符串是否包含其它字符串

    这部分教程我们主要讲解以下几个常用语法 模板字符串 带标签的模板字符串 判断字符串中是否包含其他字符串 给函数设置默认值 模板字符串 老式的拼接字符串方法 let dessert = '

  9. android4.2 webkit 中的jni

    在android 应用开发中使用WebView,当一个webveiw 被创建时, 也会去load 他所对应的动态库,这里动态库也就是传说中的webkit 内核等. C++ 层与java 层的交互也是通 ...

  10. C++学习笔记-面向对象模型探究

    C++中的class从面向对象理论出发,将变量(属性)和函数(方法)集中定义在一起,用于描述现实世界中的类.从计算机的角度,程序依然由数据段和代码段构成.那么C++编译器如何完成面向对象理论到计算机程 ...