我正在尝试使用Python和MySQL Connector将人口普查数据动态加载到mysql数据库(来自.csv文件)。
我无法弄清楚为什么我会收到错误:
Traceback (most recent call last):
File "miner.py", line 125, in <module>
cursor.execute(add_csv_file, csv_info)
File "/Library/Python/2.7/site-packages/mysql/connector/cursor.py", line 393, in execute
self._handle_result(self._connection.cmd_query(stmt))
File "/Library/Python/2.7/site-packages/mysql/connector/connection.py", line 586, in cmd_query
statement))
File "/Library/Python/2.7/site-packages/mysql/connector/connection.py", line 508, in _handle_result
raise errors.get_exception(packet)
mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '/Users/afink/Documents/Research/Current Papers & Books/Youth Assessm' at line 1
执行前输出的字符串在同一用户下的MySQL命令行界面中正常工作。
似乎它应该是一个简单的问题,但我被卡住了!
def db_connect():
config = {
'user': 'username',
'password': 'pass',
'host': 'localhost',
'database': 'uscensus',
'raise_on_warnings': True,
}
from mysql.connector import errorcode
try:
cnx = mysql.connector.connect(**config)
return cnx
except mysql.connector.Error as err:
if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
print("Something is wrong with your user name or password")
elif err.errno == errorcode.ER_BAD_DB_ERROR:
print("Database does not exist")
else:
print(err)
else:
cnx.close()
cursor = cnx.cursor()
os.chdir("./")
for files in glob.glob("*.csv"):
add_csv_file = ('''load data local infile '%(cwd)s/%(file_name)s' into table %(table_name)s
columns terminated by ','
optionally enclosed by '\"'
escaped by '\"'
lines terminated by '\\n';''')
# Insert CSV file information
csv_info = {
'cwd': os.getcwd(),
'file_name': files,
'table_name': 'SF1_' + files[2:-8],
}
print add_csv_file % csv_info # Temporary Debug
cursor.execute(add_csv_file, csv_info)
# Make sure data is committed to the database
cnx.commit()
cursor.close()
cnx.close()
提前感谢您的帮助!
答案 0 :(得分:3)
通过在连接中添加适当的客户端标志,可以轻松解决此问题,如下所示:
import mysql.connector
from mysql.connector.constants import ClientFlag
cnx = mysql.connector.connect(user='[username]', password='[pass]', host='[host]', client_flags=[ClientFlag.LOCAL_FILES])
cursor = cnx.cursor()
这将允许MySQL访问您计算机上的本地文件,然后以下LOAD将起作用:
LoadSQL = """LOAD DATA LOCAL INFILE '%s'
INTO TABLE %s
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(field1, field2, field3, field4)""" % (csvfile, tabl_name)
cursor.execute(LoadSQL)
cnx.commit()
cursor.close()
cnx.close()
答案 1 :(得分:1)
好的,这就是我的想法。
@Dd_tch - 你的回答让我意识到这段代码会更好用:
query = add_csv_file % csv_info
cursor.execute(query)
虽然连接器的MySQL站点似乎表明你可以做我正在做的事情(http://dev.mysql.com/doc/connector-python/en/connector-python-example-cursor-transaction.html),但这不起作用。
当我解决这个问题时,我遇到了一个新错误: mysql.connector.errors.ProgrammingError:1148(42000):此MySQL版本不允许使用该命令
有几个站点表明可以通过在MySQL Connector配置中添加“local_infile = 1”来解决这个问题。这是一个:http://dev.mysql.com/doc/refman/5.1/en/loading-tables.html
此解决方案对我不起作用。我的local_infile在MySQL上设置为1,我无法在Python代码中设置它,或者我得到了一个e
我将改为将LOAD LOCAL DATA INFILE替换为逐行读取CSV文件并将行插入数据库的内容。这将使代码更容易移植到其他数据库。
答案 2 :(得分:1)
在执行mysql.connector.connect时添加字段allow_local_infile = "True"
。
会
答案 3 :(得分:0)
调用execute()方法时出错:
cursor.execute(add_csv_file,csv_info)
尝试:
cursor.execute(query,(add_csv_file,csv_info,))