- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题
我可以使用 read_sql() 将 SQL 事务提交到数据库吗?
用例和背景
我有一个用例,我希望允许用户执行一些预定义的 SQL 并返回一个 Pandas 数据帧。在某些情况下,此 SQL 将需要查询预先填充的表,而在其他情况下,此 SQL 将执行一个函数,该函数将写入一个表,然后将查询该表。
此逻辑当前包含在 Airflow DAG 的方法中,以便利用使用 PostgresHook 的 Airflow 可访问的数据库连接信息 - 该方法最终在 PythonOperator 任务中调用。我通过测试了解到 PostgresHook 创建了一个 psycopg2 连接对象。
代码
from airflow.hooks.postgres_hook import PostgresHook
import pandas as pd
def create_df(job_id,other_unrelated_inputs):
conn = job_type_to_connection(job_type) # method that helps choose a database
sql = open('/sql_files/job_id_{}.sql'.format(job_id)) #chooses arbitrary SQL
sql_template = sql.read()
hook = PostgresHook(postgres_conn_id=conn) #connection information for alias is predefined elsewhere within Airflow
try:
hook_conn_obj = hook.get_conn()
print(type(hook_conn_obj)) # <class 'psycopg2.extensions.connection'>
# Runs SQL template with variables, but does not commit. Alternatively, have used hook.get_pandas_df(sql_template)
df = pd.io.sql.read_sql(sql_template, con = hook_conn_obj)
except:
#catches some errors#
return df
...
try:
hook_conn_obj = hook.get_conn()
print(type(hook_conn_obj)) # <class 'psycopg2.extensions.connection'>
hook_conn_obj.autocommit = True
df = pd.io.sql.read_sql(sql_template, con = hook_conn_obj) # Runs SQL template with variables, but does not commit
except:
#catches some errors#
return df
最佳答案
read_sql
不会提交,因为正如该方法名称所暗示的那样,目标是读取数据,而不是写入。这是来自 pandas
的不错的设计选择.这很重要,因为它可以防止意外写入并允许有趣的场景,例如运行过程、读取其效果但没有任何内容被持久化。 read_sql
的意图是阅读,而不是写作。直接表达意图是黄金标准原则。
表达您的意图的更明确的方式是 execute
(提交)明确在 fetchall
之前.但是因为pandas
没有提供从 cursor
读取的简单方法对象,您将失去 read_sql
提供的安心感并且必须自己创建 DataFrame。
所以总而言之,您的解决方案很好,通过设置 autocommit=True
您表示您的数据库交互将持续进行,因此不应该发生意外。读起来有点奇怪,但如果你把你的名字命名为 sql_template
变量类似于 write_then_read_sql
或在文档字符串中解释,意图会更清楚。
关于sql - Airflow + Pandas read_sql_query() 与提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53752500/
刚刚开始学习 Pandas 并偶然发现了“read_sql_query”: 在我的代码中有多个创建语句,并使用“read_sql_query”执行它们会使作业变得多余,例如: import panda
是否可以使用炼金术 session (https://stackoverflow.com/a/33648514)调用 pandas.read_sql_query?示例: with db_session
我正在使用 pandas.read_sql_query 从 Sql 服务器读取一些数据。我读取的数据类型是Sql server中的int和real,即32位整数和32位浮点值。但在生成的数据框中,数据
当我这样做 from sqlalchemy import create_engine import pandas as pd engine = create_engine('sqlite://') c
我有一个封闭的连接: Config = dict(server = serverSample, port = 1433, username =
问题 我可以使用 read_sql() 将 SQL 事务提交到数据库吗? 用例和背景 我有一个用例,我希望允许用户执行一些预定义的 SQL 并返回一个 Pandas 数据帧。在某些情况下,此 SQL
我正在使用 Python(Jupyter Notebook)和 Postgres 数据库,并且正在努力填充 Pandas 数据框。 sql 代码使用 pgAdmin4 中的查询生成器运行良好 SELE
我正在尝试在 python pandas 中组合一个 SQL 查询。我尝试了不同的方法,但总是出现以下错误:提供的绑定(bind)数量不正确。当前语句使用 6 个,提供了 3 个。 我的代码如下。我做
我有两个表:trainSearcStream 和 SearchInfo。我的代码应该根据名为 SearchID 的公共(public)列合并这两个表。问题是代码运行了一段时间然后终止而没有在我的 ec
我正在使用 pandas read_sql_query 将数据从 MySQL 数据库表读取到 pandas 数据帧中。此表中的某些列全部为 NULL 值。对于这些列, Pandas 数据框的每一行都包
我有以下行 df = pandas.read_sql_query(sql = sql_script, con=conn, coerce_float = False) 使用 sql 脚本从 Postgr
我想使用类似于 pandas“read_sql_query”的东西,将数据库中的数据加载到 numpy 数组中,而不是 pandas 数据帧中。 在 pandas 中我使用类似的东西: df = pd
我有一个带有字符串类型列的 df,单元格可能是空字符串“”(中间没有空格)。我想将 df 写入 mysql,如下所示: df.to_sql(name, conn) 然后我想查询 df 并过滤掉带有空字
从 MySQL 数据库检索数据时,Pandas parse_date 应该如何工作? Pandas 0.23 的文档提供此信息: parse_dates : list or dict, default
我有一个包含以下列的表格: | Date | ProductId | SubProductId | Value | 我正在尝试从该表中检索数据并将其放入 pandas DataFrame 中。 我希望
在处理数据库 decimal 数据类型时,我遇到了 Pandas read_sql_query() 函数的问题。在使用 varchar 或 integer 类型时,我对下面相同的代码没有任何问题。 版
我试图在 sql 查询中传递三个变量。这些是地区、功能、新用户。我正在使用 SQL 驱动程序 SQL Server Native Client 11.0。 这是我的有效代码。 query = "SEL
我想执行一个操作,我想删除 postgres 中的所有行(但不删除表)并更新其中的新行。我想使用 pandas 的 pd.read_sql_query() 方法: qry = 'delete from
我一直在尝试测试使我的代码运行的各种方法。首先,我有这个列表: member_list = [111,222,333,444,555,...] 我试图将它传递到这个查询中: query = pd.re
我正在使用 pandas.read_sql_query 函数读取一些 sql 文件。一个查询在我挑出的某一特定位处抛出错误。 (python 位 - 没有什么奇怪的并且可以与其他查询一起使用) @co
我是一名优秀的程序员,十分优秀!