“ with”语句在Windows中有效,但在Ubuntu中不起作用

京东

我有一个脚本(请参阅下文),可以在Windows中正常运行,并且可以尝试移至Ubuntu环境。我已将PostgreSQL数据库设置为完全相同,具有完全相同的表和用户名等。但是,当我尝试在Ubunu中运行脚本时,它在解析“ with”语句时会失败。

这是“ with”语句:

with con: 
    cur = con.cursor()
    cur.executemany(final_str, symbols)

我收到以下错误:

INSERT INTO symbol (ticker, instrument, name, sector, currency, created_date, last_updated_date) VALUES (%s, %s, %s, %s, %s, %s, %s) 502
Traceback (most recent call last):
  File "loadSPX.py", line 60, in <module>
    insert_snp500_symbols(symbols)
  File "loadSPX.py", line 54, in insert_snp500_symbols
    with con: 
AttributeError: __exit__

但是,如果我删除“ with”并将其更改为以下内容,则效果很好:

cur = con.cursor()   
cur.executemany(final_str, symbols)  
con.commit()

任何想法是什么原因造成的?以下是完整的脚本:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import datetime
import lxml.html
import psycopg2 as mdb
import psycopg2.extras

from math import ceil


def obtain_parse_wiki_snp500():
  """Download and parse the Wikipedia list of S&P500 
  constituents using requests and libxml.

  Returns a list of tuples for to add to database."""

  # Stores the current time, for the created_at record
  now = datetime.datetime.utcnow()

  # Use libxml to download the list of S&P500 companies and obtain the symbol table
  page = lxml.html.parse('http://en.wikipedia.org/wiki/List_of_S%26P_500_companies')
  symbolslist = page.xpath('//table[1]/tr')[1:503]

  # Obtain the symbol information for each row in the S&P500 constituent table
  symbols = []
  for symbol in symbolslist:
    tds = symbol.getchildren()
    sd = {'ticker': tds[0].getchildren()[0].text,
        'name': tds[1].getchildren()[0].text,
        'sector': tds[3].text}
    # Create a tuple (for the DB format) and append to the grand list
    symbols.append( (sd['ticker'], 'stock', sd['name'], 
      sd['sector'], 'USD', now, now) )
  return symbols

def insert_snp500_symbols(symbols):
  """Insert the S&P500 symbols into the database."""

  # Connect to the PostgreSQL instance
  db_host = 'localhost'
  db_user = 'sec_user'
  db_pass = 'XXXXXXX'
  db_name = 'securities_master'
  con = mdb.connect(host=db_host, dbname=db_name, user=db_user, password=db_pass)

  # Create the insert strings
  column_str = "ticker, instrument, name, sector, currency, created_date, last_updated_date"
  insert_str = ("%s, " * 7)[:-2]
  final_str = "INSERT INTO symbol (%s) VALUES (%s)" % (column_str, insert_str)
  print final_str, len(symbols)

  # Using the MySQL connection, carry out an INSERT INTO for every symbol
  with con: 
    cur = con.cursor()
    cur.executemany(final_str, symbols)

if __name__ == "__main__":
  symbols = obtain_parse_wiki_snp500()
  insert_snp500_symbols(symbols)
马丁·彼得斯(Martijn Pieters)

psycopg2在Ubuntu上的库太旧了;您需要升级到2.5版或更高版本。在旧版本中,连接尚不支持用作上下文管理器。

请参阅Psycopg 2.5发布公告

连接和游标作为上下文管理器

最近的DBAPI扩展已经标准化了将连接和游标用作上下文管理器:现在可以使用如下习惯用法:

with psycopg2.connect(DSN) as conn:
    with conn.cursor() as curs:
       curs.execute(SQL)

具有直观的行为:当光标块退出时,光标被关闭;当连接块正常退出时,当前事务将被提交,如果它退出并带有异常,则事务将被回滚,无论哪种情况,连接都准备好再次使用

如果安装了python-psycopg2系统软件包,则最有可能使用2.4.5;否则,请参见1-4。只有Utopic Unicorn(14.10)具有更新的版本(2.5.3)。要从源头安装较新的版本,您需要安装Python开发标头(python-dev)和PostgreSQL客户端库标头(libpq-dev)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

推送通知在iOS7中不起作用,但在iOS6中有效

来自分类Dev

通过PHP设置Cookie在Chrome中有效,但在Firefox或IE中不起作用

来自分类Dev

优良的上载器异步任务在Chrome中有效,但在IE11中不起作用

来自分类Dev

按钮在Chrome浏览器中有效,但在Mozilla中不起作用

来自分类Dev

代码在JSFiddle中有效,但在Dreamweaver中不起作用(不涉及jquery)

来自分类Dev

jQuery error()在Chrome和IE中有效,但在Firefox中不起作用

来自分类Dev

将页面重定向到aspx页面在chrome中有效,但在IE中不起作用

来自分类Dev

“找不到成员”-jQuery在MSIE中不起作用,但在Chrome中有效-

来自分类Dev

UDF对字符串进行编码在psql和Perl中有效,但在Python中不起作用

来自分类Dev

点击页面上的滚动在FF中有效,但在Chrome中不起作用

来自分类Dev

使用反射的对象实例化在VB.NET中有效,但在C#中不起作用

来自分类Dev

按特定键在JavaScript中执行某些操作在Chrome中有效,但在Firefox中不起作用

来自分类Dev

在Windows 7调试指令中有效的循环语句在DOSBox 0.74中不起作用

来自分类Dev

此代码在片段中有效,但在博客中不起作用

来自分类Dev

交换整数的代码在C ++中有效,但在C中不起作用

来自分类Dev

动态生成的html链接在Firefox中有效,但在Chrome中不起作用

来自分类Dev

获取Class属性在IE9中有效,但在IE8中不起作用

来自分类Dev

解析XML标签属性在Firefox中有效,但在Chrome中不起作用

来自分类Dev

添加的间距在Firefox中有效,但在Chrome和Safari中不起作用

来自分类Dev

window.open在Firefox中有效,但在IE或Chrome中不起作用

来自分类Dev

导航图在Power Map中有效,但在Power View Map中不起作用

来自分类Dev

Livecode Browser中的JavaScript函数在OSX上有效,但在Windows上不起作用

来自分类Dev

htaccess(RewriteRule)在wamp中有效,但在实际服务器中不起作用

来自分类Dev

编码在Windows OS中有效,但在Mac OS中不起作用(运行时错误1004)

来自分类Dev

mysql / connector python查询在mysql中有效,但在python中不起作用

来自分类Dev

javascript mailto在chrome中有效,但在IE中不起作用

来自分类Dev

单选按钮在谷歌浏览器中有效,但在Firefox中不起作用

来自分类Dev

在Windows 7调试指令中有效的循环语句在DOSBox 0.74中不起作用

来自分类Dev

AWK 命令在 linux 中不起作用,但在 mac 中有效

Related 相关文章

  1. 1

    推送通知在iOS7中不起作用,但在iOS6中有效

  2. 2

    通过PHP设置Cookie在Chrome中有效,但在Firefox或IE中不起作用

  3. 3

    优良的上载器异步任务在Chrome中有效,但在IE11中不起作用

  4. 4

    按钮在Chrome浏览器中有效,但在Mozilla中不起作用

  5. 5

    代码在JSFiddle中有效,但在Dreamweaver中不起作用(不涉及jquery)

  6. 6

    jQuery error()在Chrome和IE中有效,但在Firefox中不起作用

  7. 7

    将页面重定向到aspx页面在chrome中有效,但在IE中不起作用

  8. 8

    “找不到成员”-jQuery在MSIE中不起作用,但在Chrome中有效-

  9. 9

    UDF对字符串进行编码在psql和Perl中有效,但在Python中不起作用

  10. 10

    点击页面上的滚动在FF中有效,但在Chrome中不起作用

  11. 11

    使用反射的对象实例化在VB.NET中有效,但在C#中不起作用

  12. 12

    按特定键在JavaScript中执行某些操作在Chrome中有效,但在Firefox中不起作用

  13. 13

    在Windows 7调试指令中有效的循环语句在DOSBox 0.74中不起作用

  14. 14

    此代码在片段中有效,但在博客中不起作用

  15. 15

    交换整数的代码在C ++中有效,但在C中不起作用

  16. 16

    动态生成的html链接在Firefox中有效,但在Chrome中不起作用

  17. 17

    获取Class属性在IE9中有效,但在IE8中不起作用

  18. 18

    解析XML标签属性在Firefox中有效,但在Chrome中不起作用

  19. 19

    添加的间距在Firefox中有效,但在Chrome和Safari中不起作用

  20. 20

    window.open在Firefox中有效,但在IE或Chrome中不起作用

  21. 21

    导航图在Power Map中有效,但在Power View Map中不起作用

  22. 22

    Livecode Browser中的JavaScript函数在OSX上有效,但在Windows上不起作用

  23. 23

    htaccess(RewriteRule)在wamp中有效,但在实际服务器中不起作用

  24. 24

    编码在Windows OS中有效,但在Mac OS中不起作用(运行时错误1004)

  25. 25

    mysql / connector python查询在mysql中有效,但在python中不起作用

  26. 26

    javascript mailto在chrome中有效,但在IE中不起作用

  27. 27

    单选按钮在谷歌浏览器中有效,但在Firefox中不起作用

  28. 28

    在Windows 7调试指令中有效的循环语句在DOSBox 0.74中不起作用

  29. 29

    AWK 命令在 linux 中不起作用,但在 mac 中有效

热门标签

归档