2014-03-05 82 views
1

我写一个函数来创建一个表:创建表与外键

def createSQLCreateTableCommand(tableName, columns, foreignKeys): 
    columns = ["%s"%(c) for c in columns] 
    foreignKeys = ["FOREIGN KEY (%s) REFERENCES %s(%s)"%(fk[0],fk[1],fk[2]) for fk in foreignKeys] 
    cmd = """CREATE TABLE IF NOT EXISTS %s (%s)"""%(tableName,','.join(columns+foreignKeys)) 
    return cmd 

我想测试我的功能和写下面的代码。 “访问”和“测试”只是一些列的表格。在表“test_result”中,它包含“访问”表中的rowid的外键以及“test”表中的rowid的外键。我的代码适用于“访问”和“测试”表,但未能证明“test_result”表。我不确定不能正确表达外键参数。任何人都可以帮助我解决我的代码?

conn = sqlite.connect(":memory:") 
cursor = conn.cursor() 

sqlVisits = createSQLCreateTableCommand("visit",["visitid text"],[]) 
sqlTests = createSQLCreateTableCommand("test",["name text","unit text","low text","high text"],[]) 
sqlTestResults = createSQLCreateTableCommand("test_result",["value text","time_date text"],["visit int","test int"]) #this is not correct 

cursor.execute(sqlVisits) 
cursor.execute(sqlTests) 
cursor.execute(sqlTestResults) 
conn.commit() 

cursor.execute("""SELECT tbl_name FROM sqlite_master WHERE type = 'table'""") 
print cursor.fetchall() 

回答

0

当打印功能的实际输出:

>>> createSQLCreateTableCommand("test_result",["value text","time_date text"],["visit int","test int"]) 
CREATE TABLE IF NOT EXISTS test_result (
    value text, 
    time_date text, 
    FOREIGN KEY (v) REFERENCES i(s), 
    FOREIGN KEY (t) REFERENCES e(s) 
) 

你看到这样的表达式从字符串fk[0]提取单个字符。

参数foreignKeys必须的东西的数组,由三个字符串:孩子列名,父表名和父列名:

>>> print createSQLCreateTableCommand("test_result", 
...         ["value text", "time_date text"], 
...         [("visitid", "visit", "visitid"), 
...         ("testname", "test", "name")]) 
CREATE TABLE IF NOT EXISTS test_result (
    value text, 
    time_date text, 
    FOREIGN KEY (visitid) REFERENCES visit(visitid), 
    FOREIGN KEY (testname) REFERENCES test(name) 
) 

然而,这不是有效的SQL,因为FOREIGN KEY约束必须引用子表中的现有的列。

为了解决这个问题,改变createSQLCreateTableCommand功能与列约束为外键创建列:

>>> def createSQLCreateTableCommand(tableName, columns, foreignKeys): 
...  columns = ["%s"%(c) for c in columns] 
...  foreignKeys = ["%s REFERENCES %s(%s)"%(fk[0],fk[1],fk[2]) for fk in foreignKeys] 
...  cmd = """CREATE TABLE IF NOT EXISTS %s (%s)"""%(tableName,','.join(columns+foreignKeys)) 
...  return cmd 
... 
>>> print createSQLCreateTableCommand("test_result", 
...         ["value text", "time_date text"], 
...         [("visitid text", "visit", "visitid"), 
...         ("testname text", "test", "name")]) 
CREATE TABLE IF NOT EXISTS test_result (
    value text, 
    time_date text, 
    visitid text REFERENCES visit(visitid), 
    testname text REFERENCES test(name) 
)