Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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 SQL Server中SQLAlchemy插入的参数类型错误无效_Python_Sql Server_Insert_Sqlalchemy - Fatal编程技术网

Python SQL Server中SQLAlchemy插入的参数类型错误无效

Python SQL Server中SQLAlchemy插入的参数类型错误无效,python,sql-server,insert,sqlalchemy,Python,Sql Server,Insert,Sqlalchemy,我正在努力通过SQLAlchemy在SQL Server中插入一对多关系。无论我做什么尝试,我都会得到一个无效参数类型错误 import pyodbc from sqlalchemy import BigInteger, Column, create_engine, ForeignKey, String, MetaData, Table meta = MetaData() logFile = Table('logFile', meta, Column('id', BigIntege

我正在努力通过SQLAlchemy在SQL Server中插入一对多关系。无论我做什么尝试,我都会得到一个
无效参数类型
错误

import pyodbc
from sqlalchemy import BigInteger, Column, create_engine, ForeignKey, String,
 MetaData, Table

meta = MetaData()

logFile = Table('logFile', meta,
    Column('id', BigInteger, primary_key=True),
    Column('referrer_anchor', String(900), nullable=True),
    Column('referrer_hostname', String(900), nullable=True),
    Column('referrer_path', String(900), nullable=True))

refQuery = Table('refQuery', meta,
    Column('rQ_id', BigInteger, primary_key=True),
    Column('name', String(8000)),
    Column('value', String(8000)),
    Column('foreign_key', None, ForeignKey('logFile.id'), nullable=False))

engine = create_engine(...)
conn = engine.connect()

# create dictionary
logKeys = ['referrer_anchor', 'referrer_hostname', 'referrer_path']
logVals = [myRefAnchor, myRefHost, myRefPath]
logDict = dict(zip(logKeys, logVals))

# insert
logInsert = logFile.insert().values(logDict)
result = conn.execute(logInsert)
ins_id = result.inserted_primary_key

if refQueryPairs:
    newDict = []
    names = ['name', 'value', 'foreign_key']
    for k, v in refQueryPairs.items():
        vals = [k, v, ins_id]
        tempDict = dict(zip(names, vals))
        newDict.append(tempDict)
    ins = refQuery.insert().values(newDict)
    conn.execute(ins)
当我运行这段代码时,在第二次插入之前,一切都正常工作。这意味着我的第一条insert语句
logInsert
有效。以下是该语句的输入数据:

{'referrer_anchor': '"site.com"', 'referrer_hostname': '"site.com"', 'referrer_path':
 '"/clothing/mens/shoes/6114"'}
下面是
logInsert
语句的内容:

INSERT INTO activate (referrer_anchor, referrer_hostname, referrer_path) VALUES 
(:referrer_anchor, :referrer_hostname, :referrer_path)
我的第二次插入,
conn.execute(ins)
给出了以下错误:

sqlalchemy.exc.ProgrammingError: (ProgrammingError) ('Invalid parameter type.  param-
index=2 param-type=list', 'HY105') u'INSERT INTO refQuery (name, value, foreign_key) 
OUTPUT inserted.[rQ_id] VALUES (?, ?, ?), (?, ?, ?)' (u'url', None, [2L], u'pid', u'4
3d9f', [2L])
我已经打印出了
newDict
,它的格式与

我试过:

  • 删除我的数据库&从头开始重新创建
  • 将insert语句移动到for循环中,以便一次只有一个insert
  • conn.execute(refQuery.insert(),newDict)的形式发出insert语句
  • 对所有字符串进行编码,这样我就不会混合使用字符串和unicode
  • 将implicit_returning设置为False以禁用refQuery主键的返回
到目前为止一切都不起作用,每次都是同样的错误。有人能给我指出正确的方向吗?

请注意错误:

 'Invalid parameter type.  param-index=2 param-type=list
然后在参数索引2中输入值:

(u'url', None, [2L]
您提交的是一个列表,而不是单个值

您的问题是这一行:

ins_id = result.inserted_primary_key
根据文件

http://docs.sqlalchemy.org/en/latest/core/connections.html?highlight=inserted_primary_key#sqlalchemy.engine.ResultProxy.inserted_primary_key
返回刚刚插入的行的主键。 返回值是与目标表中主键列列表相对应的标量值列表。”

所以你想要:

ins_id = result.inserted_primary_key[0]
注意文档中的术语“标量值”。SqlAlchemy通常会在您可能期望的情况下返回一个“列表”。例如:如果您选择单个列,如
session.query(Model.id).filter(id==1)。首先()
,您的结果将是
(1,)
,而不是
1

我将“list”放在引号中,因为该列查询上的响应是一个“类似列表”或“类似元组”的对象,称为“KeyedTuple”,类似于标准库中的
集合.namedtuple
,允许您访问
结果[0]
结果.id

ins_id = result.inserted_primary_key[0]