2017-01-14 198 views
1

我的目标是创建一个包含表(和条目)的数据库,其中包含有关S 500组成成员的信息。Python/MySQL:编程错误1146 - 表不存在

1)我一直在使用自制安装了MySQL,创建一个数据库和一个表名为 'securities_master'

Terminal screen grab

2)我打开的Spyder并输入以下

#!/usr/bin/env python2 
# -*- coding: utf-8 -*- 
# insert_symbols.py 
""" 
Created on Fri Jan 13 17:42:53 2017 

@author: 
""" 



from __future__ import print_function 

import datetime 
from math import ceil 
import bs4 
import MySQLdb as mdb 
import requests 


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

Returns a list of tuples for to add to MySQL. 
""" 
# Stores the current time, for the created_at record 
now = datetime.datetime.utcnow() 

# Use requests and BeautifulSoup to download the 
# list of S&P500 companies and obtain the symbol table 
response = requests.get(
    "http://en.wikipedia.org/wiki/List_of_S%26P_500_companies" 
) 
soup = bs4.BeautifulSoup(response.text) 

# This selects the first table, using CSS Selector syntax 
# and then ignores the header row ([1:]) 
symbolslist = soup.select('table')[0].select('tr')[1:] 

# Obtain the symbol information for each 
# row in the S&P500 constituent table 
symbols = [] 
for i, symbol in enumerate(symbolslist): 
    tds = symbol.select('td') 
    symbols.append(
     (
      tds[0].select('a')[0].text, # Ticker 
      'stock', 
      tds[1].select('a')[0].text, # Name 
      tds[3].text, # Sector 
      'USD', now, now 
     ) 
    ) 
return symbols 


def insert_snp500_symbols(symbols): 
""" 
Insert the S&P500 symbols into the MySQL database. 
""" 
# Connect to the MySQL instance 
db_host = 'localhost' 
db_user = 'root' 
db_pass = '' 
db_name = 'securities_master' 
con = mdb.connect(
    host=db_host, user=db_user, passwd=db_pass, db=db_name 
) 

# 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) 

# 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) 
print("%s symbols were successfully added." % len(symbols)) 

3)以上内容是从本书逐字复制的,应该填入'securities_master'中的'symbol'表中,但您可以看到它会返回错误...

in [2]: runfile('/Users/alexfawzi/untitled4.py',   wdir='/Users/alexfawzi') 
Traceback (most recent call last): 

File "<ipython-input-2-ecff2c9aa5ce>", line 1, in <module> 
runfile('/Users/alexfawzi/untitled4.py', wdir='/Users/alexfawzi') 

File "/Users/alexfawzi/anaconda/lib/python2.7/site- packages/spyder/utils/site/sitecustomize.py", line 866, in runfile 
execfile(filename, namespace) 

File "/Users/alexfawzi/anaconda/lib/python2.7/site-packages/spyder/utils/site/sitecustomize.py", line 94, in execfile 
builtins.execfile(filename, *where) 

File "/Users/alexfawzi/untitled4.py", line 92, in <module> 
insert_snp500_symbols(symbols) 

File "/Users/alexfawzi/untitled4.py", line 87, in insert_snp500_symbols 
cur.executemany(final_str, symbols) 

File "/Users/alexfawzi/anaconda/lib/python2.7/site-packages/MySQLdb/cursors.py", line 253, in executemany 
r = self._query('\n'.join([query[:p], ',\n'.join(q), query[e:]])) 

File "/Users/alexfawzi/anaconda/lib/python2.7/site-packages/MySQLdb/cursors.py", line 346, in _query 
rowcount = self._do_query(q) 

File "/Users/alexfawzi/anaconda/lib/python2.7/site-packages/MySQLdb/cursors.py", line 310, in _do_query 
db.query(q) 

ProgrammingError: (1146, "Table 'securities_master.symbol' doesn't exist") 

编程错误!党!我无法想象通过选择noobs的错误很有趣,所以非常感谢任何花时间去帮助的人。

+0

你应该首先在python解释器上逐行手动运行该程序,以了解发生了什么,确保web url成功加载 –

+0

感谢您的帮助,我更改为使用SQLite,然后通过/更改它沿着一个教程一行接一行,它不仅工作,但我实际上明白我在看什么。非常感激 –

回答

0

不再创建这些蜱一切“的尝试反引号`

变化final_str这样:

final_str = "INSERT INTO symbol (%s) VALUES (%s)" % (column_str, insert_str) 
0

的关键是SHOW TABLES;显示引号(又名‘花’引号) ,而不是......好......没什么。该查询的结果应该显示没有引号的表名,这意味着您不小心创建了带有“卷曲”引号的表。

例如:

show tables example

你的选项来改变这样的代码:

final_str = "INSERT INTO `‘symbol’` (%s) VALUES (%s)" 

或重新创建该表不带引号。

做第二个。

我猜你最初是从网站或文档复制表名,这可以解释为什么它会'卷曲'而不是'直'引号(')。直引号意味着大多数编程语言中的字符串,但卷符不实际用于编程 - 它们被文字处理器和所见即所得编辑器替换为文本。