【问题标题】:MySQL Python Insert strange?MySQL Python Insert 奇怪?
【发布时间】:2011-10-24 03:25:21
【问题描述】:

我不明白为什么它不起作用。我已经创建了几个数据库和表,显然没有问题。但是我被这个从 django 数据模型创建的表卡住了。为了澄清我所做的,从 mysql 控制台创建了新的数据库和表,并尝试从 python 插入并工作。但是,这对我来说很奇怪。

class Experiment(models.Model):
    user = models.CharField(max_length=25)
    filetype = models.CharField(max_length=10)
    createddate= models.DateField()
    uploaddate = models.DateField()
    time = models.CharField(max_length=20)
    size = models.CharField(max_length=20)
    located= models.CharField(max_length=50)

这是 mysql 控制台中的视图

mysql> describe pmass_experiment;
+-------------+-------------+------+-----+---------+----------------+
| Field       | Type        | Null | Key | Default | Extra          |
+-------------+-------------+------+-----+---------+----------------+
| id          | int(11)     | NO   | PRI | NULL    | auto_increment |
| user        | varchar(25) | NO   |     | NULL    |                |
| filetype    | varchar(10) | NO   |     | NULL    |                |
| createddate | date        | NO   |     | NULL    |                |
| uploaddate  | date        | NO   |     | NULL    |                |
| time        | varchar(20) | NO   |     | NULL    |                |
| size        | varchar(20) | NO   |     | NULL    |                |
| located     | varchar(50) | NO   |     | NULL    |                |
+-------------+-------------+------+-----+---------+----------------+
8 rows in set (0.01 sec)

上面的pmass_experiment表是django ORM在python manage.py syncdb

之后创建的

现在我正在尝试通过 python MySQLdb 将数据插入 pmass_experiment

import MySQLdb
import datetime,time
import sys

conn = MySQLdb.connect(
    host="localhost",
    user="root",
    passwd="root",
    db="experiment")

cursor = conn.cursor()
user='tchand'
ftype='mzml'
size='10MB'
located='c:\'
date= datetime.date.today()
time = str(datetime.datetime.now())[10:19]

#Insert into database
sql = """INSERT INTO pmass_experiment (user,filetype,createddate,uploaddate,time,size,located)
    VALUES (user, ftype, date, date, time, size, located)"""
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   conn.commit()
except:
   # Rollback in case there is any error
   conn.rollback()
# disconnect from server
conn.close()

但是,不幸的是,没有插入任何内容。我猜这可能是由于表中的primary_key(id)没有自动增加。

mysql> select * from pmass_experiment;
Empty set (0.00 sec)

你能简单地指出我的错误吗?

谢谢

【问题讨论】:

  • 您正在捕获所有异常,因此看不出有什么问题。 raise 再次出现异常,或者至少打印它的回溯。
  • 除非那里有一些非常智能的字符串插值,否则您的查询将 字面上insert into blah (user) values (user) 这样到达数据库,这是无效的。
  • 不应该对 c:\ 进行双重转义吗? 'c:\\' 这可能是问题所在?
  • @Serdalis- 是的,应该是这样的。在这里粘贴时我更改了它。

标签: python mysql django


【解决方案1】:
sql = """INSERT INTO pmass_experiment (user,filetype,createddate,uploaddate,time,size,located)
    VALUES (user, ftype, date, date, time, size, located)"""

参数化您的 sql 并将值作为第二个参数传递给 cursor.execute

sql = """INSERT INTO pmass_experiment (user,filetype,createddate,uploaddate,time,size,located)
         VALUES (%s, %s, %s, %s, %s, %s, %s)"""
try:
   # Execute the SQL command
   cursor.execute(sql,(user, ftype, date, date, time, size, located))
   # Commit your changes in the database
   conn.commit()
except Exception as err:
   # logger.error(err) 
   # Rollback in case there is any error
   conn.rollback()

始终参数化您的 sql 是一个好习惯,因为这将有助于防止sql injection

原来的sql

INSERT INTO pmass_experiment (user,filetype,createddate,uploaddate,time,size,located)
    VALUES (user, ftype, date, date, time, size, located)

似乎是有效的。 mysql shell 中的一项实验表明它插入了一行 NULL 值:

mysql> insert into foo (first,last,value) values (first,last,value);
Query OK, 1 row affected (0.00 sec)
mysql> select * from foo order by id desc;
+-----+-------+------+-------+
| id  | first | last | value |
+-----+-------+------+-------+
| 802 | NULL  | NULL |  NULL | 
+-----+-------+------+-------+
1 row in set (0.00 sec)

所以我不确定为什么您没有看到提交给数据库表的任何行。

尽管如此,原来的 sql 可能并没有按照您的意愿行事。

【讨论】:

  • 这就是我要说的。你能解释一下我原来的 sql 是如何导致 cursor.execute 产生期望的吗?
  • 我并不是说它不起作用。我只是想进一步解释 sql 参数化。但现在很清楚了。谢谢:)
  • 哦,好的。我将在此处链接这些以供将来参考:example from the MySQLdb tutorialPEP 0249: DB-API 2.0
猜你喜欢
  • 1970-01-01
  • 2010-12-24
  • 2011-05-11
  • 2018-04-03
  • 1970-01-01
  • 2016-01-27
  • 2017-03-07
  • 1970-01-01
  • 2014-04-12
相关资源
最近更新 更多