繁体   English   中英

从Python插入MySQL-错误

[英]Inserting into MySQL from Python - Errors

我试图将记录写入MySQL数据库,其中将表jobs定义为:

CREATE TABLE jobs(
   job_id INT NOT NULL AUTO_INCREMENT,
   job_title VARCHAR(300) NOT NULL,
   job_url VARCHAR(400) NOT NULL,
   job_location VARCHAR(150),
   job_salary_low DECIMAL(25) DEFAULT(0),
   job_salary_high DECIMAL(25), DEFAULT(0),
   company VARCHAR(150),
   job_posted DATE,
   PRIMARY KEY ( job_id )
);

我正在测试的代码是:

cur.execute("INSERT INTO jobs VALUES(DEFAULT, '"+jobTitle+"','"
    +jobHref+"',"+salaryLow+","+salaryHigh+",'"+company+"',"
    +jobPostedAdjusted+"','"+salaryCurrency+"';")
print(cur.fetchall())

我得到的错误是:

pydev debugger: starting
Traceback (most recent call last):
  File "C:\Users\Me\AppData\Local\Aptana Studio 3\plugins\org.python.pydev_2.7.0.2013032300\pysrc\pydevd.py", line 1397, in <module>
    debugger.run(setup['file'], None, None)
  File "C:\Users\Me\AppData\Local\Aptana Studio 3\plugins\org.python.pydev_2.7.0.2013032300\pysrc\pydevd.py", line 1090, in run
    pydev_imports.execfile(file, globals, locals) #execute the script
  File "C:\Users\Me\Documents\Aptana Studio 3 Workspace\PythonScripts\PythonScripts\testFind.py", line 25, in <module>
    +jobPostedAdjusted+"','"+salaryCurrency+"';")
TypeError: cannot concatenate 'str' and 'float' objects

插入此记录的最佳方法是什么? 谢谢。

插入此记录的最佳方法是什么?

使用%s占位符,并将您的参数作为单独的列表传递,然后MySQLdb为您完成所有参数插值。

例如...

params = [jobTitle,
          jobHref,
          salaryLow,
          salaryHigh,
          company,
          jobPostedAdjusted,
          salaryCurrency]
cur.execute("INSERT INTO jobs VALUES(DEFAULT, %s, %s, %s, %s, %s, %s, %s)", params)

这也可以保护您免受SQL注入。


更新

cur.execute....之后,我有了print(cur.fetchall()) cur.execute....代码运行时,它打印出诸如()类的空括号。

INSERT查询不会返回结果集,因此cur.fetchall()将返回一个空列表。

当我从终端查询数据库时,我看不到任何更改。

如果您使用的是InnoDB之类的事务性存储引擎,则已明确提交事务,例如...

conn = MySQLdb.connect(...)
cur = conn.cursor()
cur.execute("INSERT ...")
conn.commit()

如果您想INSERT很多行,那么在单个事务中完成它会更快。

conn = MySQLdb.connect(...)
cur = conn.cursor()
for i in range(100):
    cur.execute("INSERT ...")
conn.commit()

...因为InnoDB(默认情况下)将在每次调用conn.commit()之后将数据同步到磁盘。

另外,是否进行commit; 声明必须在某处?

commit语句是由MySQL客户端而不是服务器解释的,因此您将无法与MySQLdb一起使用它,但最终它的作用与上一示例中的conn.commit()行相同。

错误消息说明了一切:

TypeError:无法连接“ str”和“ float”对象

Python不会将automagicaly浮点数转换为字符串。 您最好的朋友可能format

>>> "INSERT INTO jobs VALUES(DEFAULT, '{}', '{}')".format("Programmer", 35000.5)
"INSERT INTO jobs VALUES(DEFAULT, 'Programmer', '35000.5')"

但是 ,请注意,在不采取任何预防措施的情况下将用户提供的数据插入SQL字符串可能会导致SQL注入 当心...这就是为什么execute提供自己的方式来保护您免受这种风险。 像这样:

>>> cursor.execute("INSERT INTO jobs VALUES(DEFAULT, '%s', '%f', "Programmer", 35000.5)

有关此内容的完整讨论,请在网上搜索。 例如http://love-python.blogspot.fr/2010/08/prevent-sql-injection-in-python-using.html


而且,浮动类型主要用于科学计算。 但这通常由于舍入错误而不适用于货币值(这就是为什么我的表使用DECIMAL列而不是FLOAT列的原因)。 对于精确值,Python提供了decimal类型。 您应该看看它。

当需要A1 ,不能像'A' + 1那样串联。 正如西尔万(Sylvain)所说, format有效:

'A{}'.format(1)

但是在这种情况下,execute方法提供了自己的方式来处理此常见问题。

execute('A%s', (1))

有关更多完整示例,请参见文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM