Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何从列字段确定行id-SQLite 3,Python_Python 3.x_Sqlite_Foreign Keys - Fatal编程技术网

Python 3.x 如何从列字段确定行id-SQLite 3,Python

Python 3.x 如何从列字段确定行id-SQLite 3,Python,python-3.x,sqlite,foreign-keys,Python 3.x,Sqlite,Foreign Keys,在我的SQLite数据库中,我有一个名为client_dir的表,它是客户联系详细信息的目录。我还有一个名为contracts的表,其中包含不同合同的详细信息。我需要能够在client_dir中创建将合同条目绑定到客户条目的外键 问题是,我希望能够通过提供客户机名称来生成外键。如何从字段条目中调用行id 我想应该是这样的 def new_contract(): '''creates a new contract entry and links it to a client in the

在我的SQLite数据库中,我有一个名为client_dir的表,它是客户联系详细信息的目录。我还有一个名为contracts的表,其中包含不同合同的详细信息。我需要能够在client_dir中创建将合同条目绑定到客户条目的外键

问题是,我希望能够通过提供客户机名称来生成外键。如何从字段条目中调用行id

我想应该是这样的

def new_contract():
    '''creates a new contract entry and links it to a client in the client_dir table'''
    client = input("Company name...")
    #int(row_id) = client
    contract = input("New contract...")
    self.cursor.execute("INSERT INTO contracts VALUES (?)",contract,#row_id)
更新

我的桌子是这样的:

self.cursor.execute("""CREATE TABLE client_dir(cli_id INTEGER PRIMARY KEY AUTOINCREMENT, company TEXT, address TEXT, phone INTEGER, email TEXT)""")
self.cursor.execute("""CREATE TABLE contracts(con_id INTEGER PRIMARY KEY AUTOINCREMENT, contract TEXT, client_id INTEGER, FOREIGN KEY(client_id) REFERENCES client_dir(cli_id))""")
我的新合同方法如下所示:

def new_contract(self):
    '''creates a new contract entry and links it to a client in the client_dir table'''
    client = input("Company name...")

    for f_list in self.cursor.execute("SELECT cli_id FROM client_dir WHERE company = (?)",[client]):
        f_key = f_list[0]

        print(f_key) # For debugging 

        contract = input("New contract...")
        self.cursor.execute("INSERT INTO contracts VALUES (NULL,?,?)",([contract],[f_key]))
打印(f_键)是在屏幕上打印一个漂亮整洁的1,我认为它是一个int。但是我得到了这个错误:

Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
c.new_contract()
File "C:\Python33\smalltime\Client.py", line 63, in new_contract
self.cursor.execute("INSERT INTO contracts VALUES (NULL,?,?)",([contract],[f_key]))
sqlite3.InterfaceError: Error binding parameter 0 - probably unsupported type.
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
c、 新合约(
文件“C:\Python33\smalltime\Client.py”,第63行,在新合同中
self.cursor.execute(“插入合同值(NULL、、?)”、([contract]、[f_key]))
sqlite3.InterfaceError:绑定参数0时出错-可能是不支持的类型。

我现在已经解决了这个问题。这个错误是因为我为INSERT传递了错误的语法

新合同方法的正确最后一行应为:

self.cursor.execute("INSERT INTO contracts VALUES (NULL,?,?)",**([contract,f_key]))**
(以前它有两个额外的大括号:([合同],[f_键])这就把它扔掉了)

所以剩下要做的就是删除print语句并添加

self.conn.commit()

最后。

为什么要使用
rowid
?客户端联系人详细信息没有主键吗?无论哪种方式,我都需要通过传入该行的元素来获取一个表示该行的int,以便将其作为外键输入。当有人输入了他们所有的联系方式时,他们不会记得他们输入的顺序,他们需要能够键入联系人的姓名,并让程序将合同附加到该联系人。您是否要求从客户_dir中选择rowid,其中name=??它似乎在查看列名而不是列内容。这将查看
name
列的内容。