尝试在 SQLAlchemy 上运行插入语句时出现编译错误

2024-03-29

我正在编写的脚本从 API 请求新闻文章元数据。作为响应,它收到包含多篇新闻文章的结果页面。它旨在一次处理一个记录,从 json 字典中提取数据字段并将它们插入到 postgres 中。

但是,当我运行插入操作时,该函数返回:

CompileError: Unconsumed column names: urlToImage, publishedAt

如何让这个插入操作起作用?

任何帮助将不胜感激!

这是我的代码:

from sqlalchemy import MetaData # for getting table metadata
from sqlalchemy import Table # for interacting with tables
from sqlalchemy import create_engine # for creating db engine 
from sqlalchemy.dialects import postgresql
from sqlalchemy.dialects.postgresql import insert # for getting alterate query method to work

# Create DB engine
engine = create_engine('postgresql+psycopg2://{user}:{password}@{hostip}/{db}'.format(**dbkeys))


# Get metadata objects for tables in database
metadata = MetaData(engine, reflect=True)
nstream = metadata.tables['nstream']    


for item in response_page['articles']:
    # Convert datetime strings from api into Python datetime format
    dtp = datetime.strptime(item['publishedAt'], "%Y-%m-%dT%H:%M:%SZ")

    inserttw = nstream.insert().values(source_id = item['source']['id'], 
                                      source_name = item['source']['name'], 
                                      author = item['author'],
                                      title = item['title'],
                                      description = item['description'],
                                      url = item['url'],
                                      urlToImage = item['urlToImage'],
                                      publishedAt = dtp,
                                      uploaded2db = datetime.now(),
                                      content = item['content'])
    engine.execute(inserttw)

以及完整的回溯:

CompileError                              Traceback (most recent call last)
<ipython-input-10-c5f4a6bff45e> in <module>
     63     # 2. If query has more than one page, get additional pages
     64 
---> 65 get_results(tfrom, engine = engine, max_retries = 5)

<ipython-input-10-c5f4a6bff45e> in get_results(tfrom, engine, max_retries)
     39 
     40             # Append the results to the database using the helper
---> 41             process_page(results)
     42 
     43         # If there is an exception, add to the retry counter and then sleep.

<ipython-input-10-c5f4a6bff45e> in process_page(response_page)
     26                                           uploaded2db = datetime.now(),
     27                                           content = item['content'])
---> 28         engine.execute(inserttw)
     29 
     30 def get_results(tfrom, engine = engine, max_retries = 5):

~/anaconda3/lib/python3.6/site-packages/sqlalchemy/engine/base.py in execute(self, statement, *multiparams, **params)
   2073 
   2074         connection = self.contextual_connect(close_with_result=True)
-> 2075         return connection.execute(statement, *multiparams, **params)
   2076 
   2077     def scalar(self, statement, *multiparams, **params):

~/anaconda3/lib/python3.6/site-packages/sqlalchemy/engine/base.py in execute(self, object, *multiparams, **params)
    946             raise exc.ObjectNotExecutableError(object)
    947         else:
--> 948             return meth(self, multiparams, params)
    949 
    950     def _execute_function(self, func, multiparams, params):

~/anaconda3/lib/python3.6/site-packages/sqlalchemy/sql/elements.py in _execute_on_connection(self, connection, multiparams, params)
    267     def _execute_on_connection(self, connection, multiparams, params):
    268         if self.supports_execution:
--> 269             return connection._execute_clauseelement(self, multiparams, params)
    270         else:
    271             raise exc.ObjectNotExecutableError(self)

~/anaconda3/lib/python3.6/site-packages/sqlalchemy/engine/base.py in _execute_clauseelement(self, elem, multiparams, params)
   1051                 inline=len(distilled_params) > 1,
   1052                 schema_translate_map=self.schema_for_object
-> 1053                 if not self.schema_for_object.is_default else None)
   1054 
   1055         ret = self._execute_context(

<string> in <lambda>(self, bind, dialect, **kw)

~/anaconda3/lib/python3.6/site-packages/sqlalchemy/sql/elements.py in compile(self, default, bind, dialect, **kw)
    440             else:
    441                 dialect = default.StrCompileDialect()
--> 442         return self._compiler(dialect, bind=bind, **kw)
    443 
    444     def _compiler(self, dialect, **kw):

~/anaconda3/lib/python3.6/site-packages/sqlalchemy/sql/elements.py in _compiler(self, dialect, **kw)
    446         Dialect."""
    447 
--> 448         return dialect.statement_compiler(dialect, self, **kw)
    449 
    450     def __str__(self):

~/anaconda3/lib/python3.6/site-packages/sqlalchemy/sql/compiler.py in __init__(self, dialect, statement, column_keys, inline, **kwargs)
    451         # dialect.label_length or dialect.max_identifier_length
    452         self.truncated_names = {}
--> 453         Compiled.__init__(self, dialect, statement, **kwargs)
    454 
    455         if (

~/anaconda3/lib/python3.6/site-packages/sqlalchemy/sql/compiler.py in __init__(self, dialect, statement, bind, schema_translate_map, compile_kwargs)
    217             if self.can_execute:
    218                 self.execution_options = statement._execution_options
--> 219             self.string = self.process(self.statement, **compile_kwargs)
    220 
    221     @util.deprecated("0.7", ":class:`.Compiled` objects now compile "

~/anaconda3/lib/python3.6/site-packages/sqlalchemy/sql/compiler.py in process(self, obj, **kwargs)
    243 
    244     def process(self, obj, **kwargs):
--> 245         return obj._compiler_dispatch(self, **kwargs)
    246 
    247     def __str__(self):

~/anaconda3/lib/python3.6/site-packages/sqlalchemy/sql/visitors.py in _compiler_dispatch(self, visitor, **kw)
     79                     raise exc.UnsupportedCompilationError(visitor, cls)
     80                 else:
---> 81                     return meth(self, **kw)
     82         else:
     83             # The optimization opportunity is lost for this case because the

~/anaconda3/lib/python3.6/site-packages/sqlalchemy/sql/compiler.py in visit_insert(self, insert_stmt, asfrom, **kw)
   2057 
   2058         crud_params = crud._setup_crud_params(
-> 2059             self, insert_stmt, crud.ISINSERT, **kw)
   2060 
   2061         if not crud_params and \

~/anaconda3/lib/python3.6/site-packages/sqlalchemy/sql/crud.py in _setup_crud_params(compiler, stmt, local_stmt_type, **kw)
     55     try:
     56         if local_stmt_type in (ISINSERT, ISUPDATE):
---> 57             return _get_crud_params(compiler, stmt, **kw)
     58     finally:
     59         if should_restore:

~/anaconda3/lib/python3.6/site-packages/sqlalchemy/sql/crud.py in _get_crud_params(compiler, stmt, **kw)
    144             raise exc.CompileError(
    145                 "Unconsumed column names: %s" %
--> 146                 (", ".join("%s" % c for c in check))
    147             )
    148 

CompileError: Unconsumed column names: urlToImage, publishedAt

事实证明,问题是我把列名的大写字母写错了。

我通过使用解决了这个问题SQLalchemy 的检查器功能 https://docs.sqlalchemy.org/en/latest/core/reflection.html#fine-grained-reflection-with-inspector。列名在那里,只是小写。

from sqlalchemy import create_engine
from sqlalchemy.engine import reflection
insp = reflection.Inspector.from_engine(engine)
print(insp.get_columns(nstream))

混乱的根源在于,当你在 Postgres 中创建表时,Postgres 会自动小写你的列名 https://stackoverflow.com/questions/20878932/are-postgresql-column-names-case-sensitive除非您在命名时使用引号。

这是插入命令的工作版本:

inserttw = nstream.insert().values(source_id = item['source']['id'], 
                                  source_name = item['source']['name'], 
                                  author = item['author'],
                                  title = item['title'],
                                  description = item['description'],
                                  url = item['url'],
                                  urltoimage = item['urlToImage'],
                                  publishedat = dtp,
                                  uploaded2db = datetime.now(),
                                  content = item['content'])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试在 SQLAlchemy 上运行插入语句时出现编译错误 的相关文章

随机推荐

  • 相对于视图的CGPoint

    考虑一个屏幕点 CGPoint 和一个视图 UIView 它位于视图层次结构内部的某个位置 它可以是其他视图的子视图 如何将点转换为相对于视图坐标的点 首先 将该点从屏幕坐标转换为主窗口的坐标 UIWindow mainWindow UIA
  • 分配新值后将 ObservableCollection 绑定到 DataGrid

    这似乎是一个简单的问题 但我无法让它发挥作用 我有一个具有以下属性的用户控件 public ObservableCollection
  • 仅当 IP 地址获得批准时才允许用户访问页面

    如何制作一个 HTML 和 CSS PHP JavaScript 文档 只允许页面上的某些 IP 地址 我不是问 how 使用 PHP 查找 IP 地址 但如何允许基于 IP 地址访问页面 把它放在你的 php 文件的顶部并更新allowe
  • 用于创建断开连接的数据库应用程序的最佳基于 .NET3.5 的策略

    我的要求是 相对较小的数据库 25 30 个表 每个表有 4 5k 行 4 5 个用户在其笔记本电脑上拥有自己的本地数据库副本 在需要时或一天结束时进行同步 免费解决方案 正如我为 NFP 组织进行的设置一样 过去几天我一直在研究各种选择
  • 如何调试肉桂小程序?

    我想写一个肉桂小程序 这些都是基于 JavaScript 的 我希望编写的代码更改服务 打开和关闭它们 类似于WebDeveloper菜单小程序 https bitbucket org infiniteshroom cinnamon web
  • 仅保留 git 中文件子集的提交

    我想实现以下目标 保留我选择的文件的所有更改历史记录 或提交 有些文件被重命名 有些文件也从其他目录移动 我想删除与我从 git 日志中选择的文件无关的所有提交 我尝试了不同的方法 例如this https medium com ayush
  • 如何通过http打开远程sqlite数据库?

    是否可以通过 http 打开 sqlite 文件 我只需要读取数据库 并希望我可以做类似的事情 var dbFile File new File http 10 1 1 50 project db sqlite sqlConnection
  • Angular View 绑定未使用简单布尔值更新

    再见 这可能是一个菜鸟问题 但我无法让它发挥作用 我有一个简单的服务 可以切换布尔值 如果布尔值为 true 则活动类应该出现在我的 div 上 如果为 false 则没有类 就这么简单 但是布尔值已更新 但我的视图没有对此做出反应 我是否
  • if match 语句中的 #N/A 返回 FALSE

    如果出现匹配错误 我会尝试显示 FALSE 值 现在 我还无法弄清楚 我对谷歌电子表格中的公式如何工作仍然很陌生 IF MATCH A16 W46 W52 0 TRUE FALSE 如果该值存在 则当前有效 我努力了 IF ISNA MAT
  • 大于/小于的 switch 语句

    所以我想使用这样的 switch 语句 switch scrollLeft case lt 1000 do stuff break case gt 1000 lt 2000 do stuff break 现在我知道这些陈述中的任何一个 lt
  • 如何找到多维数组的 .index

    尝试了网络资源 但没有任何运气和我的视觉快速入门指南 如果我有二维 多维数组 array x x x x x S x x x x x print array index S it returns nil 然后我去输入 array x S x
  • Facebook PHP SDK - 无法正确注销

    我花了几个小时寻找这个问题的解决方案 但找不到适合我的解决方案 当我在网站上单击 注销 时 用户信息仍然可见 并且仍然显示注销按钮 这是代码 require facebook php sdk src facebook php faceboo
  • Netlify 重定向不起作用 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 所以昨天我遇到了问题 因为我无法对 GitHub 页面上托管的页面实施 301 重定向 今天我发现 Netlify 应该
  • 为什么我不能在 build() 中使用 context.read,但可以将 Provider.of 与 Listen: false 一起使用?

    文档中指出这些是相同的 并且context read只是一个捷径Provider of
  • 无法将 openlayers-3 与 webpack 一起使用

    我必须将 openlayers 包含在我正在开发的项目中 我已经尝试过将其包含在ext文件夹和 npm 我在我的工作流程中使用 Webpack 编译时 我在控制台中收到以下警告 WARNING in openlayers dist ol j
  • 基于 Observable 的 API 和取消订阅问题

    我正在尝试使用 Rx Java 创建一个用于 Android 上位置跟踪的类 我仍然不知道如何正确处理我的 Observable 的生命周期 我想要的是一个 Observable 它在第一次订阅发生时开始跟踪位置 并在最后一次订阅被丢弃时停
  • 使用承载授权将 PouchDB 同步到 Cloudant 时出现错误

    我是一名经验丰富的 JavaScript 程序员 但对 PouchDB Cloudant 和 oAuth 还很陌生 当我尝试使用承载授权同步 PouchDB 和 Cloudant 时 出现错误 reader access is requir
  • 如何停止滚动比div高度长的div?

    我有图像 与右侧对齐 位置是固定的 并且大文本内容与左侧对齐 如何做到右侧的图像和文本内容只能通过使用 bootstrap 来滚动 这是我的代码 感谢您的时间和建议
  • BigQuery 是否支持“立即执行”命令来运行动态查询?

    我可以在 Oracle 中编写这样的代码 使用 动态创建表 立即执行 sql 查询 命令 create or replace function make a table1 p table name varchar2 p column nam
  • 尝试在 SQLAlchemy 上运行插入语句时出现编译错误

    我正在编写的脚本从 API 请求新闻文章元数据 作为响应 它收到包含多篇新闻文章的结果页面 它旨在一次处理一个记录 从 json 字典中提取数据字段并将它们插入到 postgres 中 但是 当我运行插入操作时 该函数返回 CompileE