Python 尝试在SQLAlchemy上运行Insert语句时出现编译器错误

Python 尝试在SQLAlchemy上运行Insert语句时出现编译器错误,python,sql,postgresql,sqlalchemy,Python,Sql,Postgresql,Sqlalchemy,我正在编写的脚本从API请求新闻文章元数据。作为回应,它会收到一页包含多篇新闻文章的结果。它设计为一次处理一条记录,从json dict中提取数据字段并将其插入postgres 但是,当我运行insert操作时,函数返回: CompileError: Unconsumed column names: urlToImage, publishedAt 如何使此插入操作正常工作 任何帮助都将不胜感激 这是我的密码: from sqlalchemy import MetaData # for gett

我正在编写的脚本从API请求新闻文章元数据。作为回应,它会收到一页包含多篇新闻文章的结果。它设计为一次处理一条记录,从json dict中提取数据字段并将其插入postgres

但是,当我运行insert操作时,函数返回:

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
CompileError回溯(最近一次调用)
在里面
63     # 2. 如果查询有多个页面,则获取其他页面
64
--->65获取结果(tfrom,引擎=引擎,最大重试次数=5次)
获取结果(tfrom、引擎、最大重试次数)
39
40#使用helper将结果附加到数据库中
--->41过程页面(结果)
42
43#如果出现异常,请添加到重试计数器,然后休眠。
进程中页面(响应页面)
26 uploaded2db=datetime.now(),
27内容=项目[“内容”])
--->28引擎执行(inserttw)
29
30 def get_结果(tfrom,发动机=发动机,最大重试次数=5次):
执行中的~/anaconda3/lib/python3.6/site-packages/sqlalchemy/engine/base.py(self,statement,*多线程,**参数)
2073
2074连接=self.context\u连接(使用结果=True关闭)
->2075返回connection.execute(语句,*multiparams,**params)
2076
2077 def标量(self、statement、*多内存、**参数):
执行中的~/anaconda3/lib/python3.6/site-packages/sqlalchemy/engine/base.py(self、object、*多线程、**参数)
946 raise exc.ObjectNoteExecutableError(对象)
947其他:
-->948返回方法(自身、多RAM、参数)
949
950 def_execute_函数(self、func、multiparams、params):
~/anaconda3/lib/python3.6/site-packages/sqlalchemy/sql/elements.py在连接上执行(self、connection、multipams、params)
267定义在连接上执行(自、连接、多内存、参数):
268如果self.u支持执行:
-->269返回连接。_执行_子句元素(self、multiparams、params)
270其他:
271 raise exc.ObjectNoteExecutableError(自身)
~/anaconda3/lib/python3.6/site-packages/sqlalchemy/engine/base.py in\u execute\u clauseelement(self、elem、multiparams、params)
1051内联=长度(蒸馏参数)>1,
1052 schema\u translate\u map=self.schema\u用于\u对象
->1053如果不是self.schema\u,则为\u object.is\u default else无)
1054
1055 ret=self.\u执行\u上下文(
in(自身、绑定、方言,**kw)
编译中的~/anaconda3/lib/python3.6/site-packages/sqlalchemy/sql/elements.py(self、default、bind、dia方言,**kw)
440其他:
441方言=默认值。strcompiledialent()
-->442返回自编译程序(方言,bind=bind,**kw)
443
444 def_编译器(自身、方言,**kw):
编译器中的~/anaconda3/lib/python3.6/site-packages/sqlalchemy/sql/elements.py(self,方言,**kw)
446方言
447
-->448返回方言。语句_编译器(方言,self,**kw)
449
450 def________(自):
~/anaconda3/lib/python3.6/site-packages/sqlalchemy/sql/compiler.py in_uuuuinit_uuuu(self、方言、语句、列键、内联、**kwargs)
451#dialogue.label_length或dialogue.max_identifier_length
452 self.truncated_names={}
-->453已编译。uuu init_uuuu(自我、方言、语句,**kwargs)
454
455如果(
~/anaconda3/lib/python3.6/site-packages/sqlalchemy/sql/compiler.py in\uuuuuu init\uuuuuuuuuu(self、方言、语句、绑定、模式翻译、映射、编译)
217如果self.u能够执行:
218 self.execution\u options=语句。\u execution\u options
-->219 self.string=self.process(self.statement,**编译)
220
221@util.deprecated(“0.7”,”:类:`.Compiled`objects now Compiled”
~/anaconda3/lib/python3.6/site-packages/sqlalchemy/sql/compiler.py进程中(self,obj,**kwargs)
243
244 def流程(自身、obj、**kwargs):
-->245返回obj.\u编译器\u分派(自我,**kwargs)
246
247 def_________(自我):
~/anaconda3/lib/python3.6/site-packages/sqlalchemy/sql/visitors.py在编译器调度中(self,visitor,**kw)
79提升执行未支持的编译错误(访客,cls)
80其他:
--->81返回法(自身,**千瓦)
82其他:
83#由于
~/anaconda3/lib/python3.6/site-packages/sqlalchemy/sql/compiler.py访问插入(self,插入stmt,asfrom,**kw)
2057
2058积垢参数=积垢设置积垢参数(
->2059自,插入式,积垢插入式,**千瓦)
2060
2061如果不是积垢参数,以及\
~/anaconda3/lib/python3.6/site-packages/sqlalchemy/sql/crud.py在_setup\u crud\u参数中(编译器、stmt、本地类型,**kw)
55尝试:
56如果本地输入(ISINSERT、ISUPDATE):
--->57返回参数(编译器,stmt,**kw)
58最后:
59如果您应该恢复:
~/anaconda3/lib/python3.6/site-packages/sqlalchemy/sql/crud.py in_get_crud_参数(编译器,stmt,**kw)
144提升exc.CompileError(
145“未使用的列名:%s”%
-->146(“,”.join(“%s”%c表示检查中的c))
147             )
148
编译器错误:未使用的列名:urlToImage,publishedAt

问题是,我把列名的大写错误了

我是通过使用这个专栏来解决这个问题的
from sqlalchemy import create_engine
from sqlalchemy.engine import reflection
insp = reflection.Inspector.from_engine(engine)
print(insp.get_columns(nstream))
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'])