Chris Leonard
2014-11-13 16:12:20 UTC
I'm struggling with inserting one-to-many relationship in SQL Server via
SQLAlchemy. I'm getting an Invalid parameter type error no matter what I
try. My input data is a line of JSON.
The error message is:
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'43d9f', [2L])
I've tried:
- deleting my database & recreating from scratch
- moving the insert statement inside the for-loop so that there's only one
insert at a time
- issuing the insert statement as conn.execute(refQuery.insert(), newDict)
- encoding all of my strings so that I'm not mixing strings & unicode
- set implicit_returning to False to disable the return of of the refQuery
primary key
I can get the insert statements to work within the ORM, but I'm working
with log files that have ~500k rows so ORM is crazy slow. So far no luck
duplicating my work within core.
My code is below. The first insert statement works as expected. I'd
appreciate any help.
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),
implicit_returning = 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) # THIS INSERT WORKS
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)
SQLAlchemy. I'm getting an Invalid parameter type error no matter what I
try. My input data is a line of JSON.
The error message is:
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'43d9f', [2L])
I've tried:
- deleting my database & recreating from scratch
- moving the insert statement inside the for-loop so that there's only one
insert at a time
- issuing the insert statement as conn.execute(refQuery.insert(), newDict)
- encoding all of my strings so that I'm not mixing strings & unicode
- set implicit_returning to False to disable the return of of the refQuery
primary key
I can get the insert statements to work within the ORM, but I'm working
with log files that have ~500k rows so ORM is crazy slow. So far no luck
duplicating my work within core.
My code is below. The first insert statement works as expected. I'd
appreciate any help.
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),
implicit_returning = 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) # THIS INSERT WORKS
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)
--
You received this message because you are subscribed to the Google Groups "sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+***@googlegroups.com.
To post to this group, send email to ***@googlegroups.com.
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.
You received this message because you are subscribed to the Google Groups "sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+***@googlegroups.com.
To post to this group, send email to ***@googlegroups.com.
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.