2011-10-22 62 views
1

我不明白为什么它不起作用。我创建了几个数据库和表格,显然没有问题。但我坚持这个从django数据模型创建的表。为了阐明我所做的,从mysql控制台创建了新的数据库和表,并尝试从python插入并工作。但是,这对我来说很奇怪。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后蟒蛇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) 

你能指出我的错吗?

感谢

+1

您正在捕捉所有异常,因此看不到错在哪里。要么再次抛出异常,要么至少打印回溯。 – utapyngo

+0

除非有一些真正智能的字符串插值在那里进行,否则您的查询将像这样插入到blah(用户)值(用户)这个无效的数据库中到达DB_literally_。 – Mat

+0

不应该c:\是双重逃脱? 'c:\'这可能是问题所在? – Serdalis

回答

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壳的实验表明它插入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可能不会做你想要的。

+0

这就是我正在谈论的。你能解释一下我的原始sql是如何导致cursor.execute引发异常的吗? – thchand

+0

我不是说它不工作。我只想进一步解释关于sql参数化。但现在很明显。谢谢:) – thchand

+0

哦,好的。我只是将它们链接到这里以供将来参考:[来自MySQLdb教程的示例](http://mysql-python.sourceforge.net/MySQLdb.html#some-examples)和[PEP 0249:DB-API 2.0](http://www.python.org/dev/peps/pep-0249/) – unutbu