Re: [sqlalchemy] ArgumentError: Only one Column may be marked autoincrement=True, found both id and id.` when I run the following insert

2020-08-22 Thread Mike Bayer
changing the "key" of a column during reflection is not a process that's ever 
been supported before.   you would be better off using a synonym here:

from sqlalchemy.orm import Session, synonym


_AutomapBase = automap.automap_base()


class Model1(_AutomapBase):
__tablename__ = "model1"

id_ = synonym("id")
tag = Column(String())




On Sat, Aug 22, 2020, at 12:14 PM, Mike Bayer wrote:
> Hi Im not able to reproduce this, though I will grant things dont seem to 
> work very well in this area, would need to know *exactly* what it is you are 
> trying to accomplish. please alter the MCVE below to reproduce your error, it 
> passes for me however does have a warning:
> 
> from sqlalchemy import Column
> from sqlalchemy import create_engine
> from sqlalchemy import Integer
> from sqlalchemy import String
> from sqlalchemy.ext import automap
> from sqlalchemy.orm import Session
> 
> 
> _AutomapBase = automap.automap_base()
> 
> 
> class Model1(_AutomapBase):
> __tablename__ = "model1"
> 
> id_ = Column(
> "id", Integer, primary_key=True, autoincrement=True, key="id_"
> )
> tag = Column(String())
> 
> 
> e = create_engine("sqlite://", echo=True)
> with e.connect() as conn:
> conn.execute("create table model1 (id integer primary key, tag varchar)")
> 
> _AutomapBase.metadata.reflect(bind=e, only=["model1"], extend_existing=True)
> _AutomapBase.prepare()
> 
> row = Model1(tag="tag1")
> 
> 
> s = Session(e)
> s.add(row)
> s.flush()
> 
> 
> 
> 
> On Sat, Aug 22, 2020, at 10:43 AM, Vitaly Kruglikov wrote:
>> Dear all,
>> 
>> I am using:
>> sqlalchemy==1.3.18
>> psycopg2==2.8.4
>> connection url schema: "postgresql+psycopg2://..."
>> postgres 10.x
>> 
>> 
>> My code looks like this:
>> 
>> ```
>> _AutomapBase = automap.automap_base()
>> 
>> class Model1(_AutomapBase):
>> **__tablename__ = 'model1"
>> 
>> id_ = sa.Column('id', sa.Integer, primary_key=True, autoincrement=True,
>>key='id_')
>> tag = sa.Column(sa.String())
>> 
>> _AutomapBase.metadata.reflect(bind=ENGINE, only=['model1'], 
>> extend_existing=True)
>> _AutomapBase.prepare()
>> 
>> row = Model1(tag='tag1')
>> orm_session.add(attempt)
>> orm_session.flush()
>> ```
>> 
>> I get the exception `ArgumentError: Only one Column may be marked 
>> autoincrement=True, found both id and id.` when I run the following insert:
>> ```
>>   File 
>> "/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/orm/session.py",
>>  line 2523, in flush
>> self._flush(objects)
>>   File 
>> "/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/orm/session.py",
>>  line 2664, in _flush
>> transaction.rollback(_capture_exception=True)
>>   File 
>> "/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/util/langhelpers.py",
>>  line 68, in __exit__
>> compat.raise_(
>>   File 
>> "/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/util/compat.py",
>>  line 178, in raise_
>> raise exception
>>   File 
>> "/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/orm/session.py",
>>  line 2624, in _flush
>> flush_context.execute()
>>   File 
>> "/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/orm/unitofwork.py",
>>  line 422, in execute
>> rec.execute(self)
>>   File 
>> "/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/orm/unitofwork.py",
>>  line 586, in execute
>> persistence.save_obj(
>>   File 
>> "/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/orm/persistence.py",
>>  line 239, in save_obj
>> _emit_insert_statements(
>>   File 
>> "/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/orm/persistence.py",
>>  line 1135, in _emit_insert_statements
>> result = cached_connections[connection].execute(
>>   File 
>> "/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/engine/base.py",
>>  line 1014, in execute
>> return meth(self, multiparams, params)
>>   File 
>> "/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/sql/elements.py",
>>  line 298, in _execute_on_connection
>> return connection._execute_clauseelement(self, multiparams, params)
>>   File 
>> "/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/engine/base.py",
>>  line 1108, in _execute_clauseelement
>> compiled_sql = elem.compile(
>>   File "", line 1, in 
>>   File 
>> "/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/sql/elements.py",
>>  line 476, in compile
>> return self._compiler(dialect, bind=bind, **kw)
>>   File 
>> "/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/sql/elements.py",
>>  line 482, in _compiler
>> return dialect.statement_compiler(dialect, self, **kw)
>>   File 
>> "/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/sql/compiler.py",
>>  line 590, in __init__
>> Compiled.__init__(self, dialect, statement, **kwargs)
>>   File 
>> "/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/sql/compiler.py",
>>  line 319, in 

Re: [sqlalchemy] ArgumentError: Only one Column may be marked autoincrement=True, found both id and id.` when I run the following insert

2020-08-22 Thread Mike Bayer
Hi Im not able to reproduce this, though I will grant things dont seem to work 
very well in this area, would need to know *exactly* what it is you are trying 
to accomplish. please alter the MCVE below to reproduce your error, it passes 
for me however does have a warning:

from sqlalchemy import Column
from sqlalchemy import create_engine
from sqlalchemy import Integer
from sqlalchemy import String
from sqlalchemy.ext import automap
from sqlalchemy.orm import Session


_AutomapBase = automap.automap_base()


class Model1(_AutomapBase):
__tablename__ = "model1"

id_ = Column(
"id", Integer, primary_key=True, autoincrement=True, key="id_"
)
tag = Column(String())


e = create_engine("sqlite://", echo=True)
with e.connect() as conn:
conn.execute("create table model1 (id integer primary key, tag varchar)")

_AutomapBase.metadata.reflect(bind=e, only=["model1"], extend_existing=True)
_AutomapBase.prepare()

row = Model1(tag="tag1")


s = Session(e)
s.add(row)
s.flush()




On Sat, Aug 22, 2020, at 10:43 AM, Vitaly Kruglikov wrote:
> Dear all,
> 
> I am using:
> sqlalchemy==1.3.18
> psycopg2==2.8.4
> connection url schema: "postgresql+psycopg2://..."
> postgres 10.x
> 
> 
> My code looks like this:
> 
> ```
> _AutomapBase = automap.automap_base()
> 
> class Model1(_AutomapBase):
> **__tablename__ = 'model1"
> 
> id_ = sa.Column('id', sa.Integer, primary_key=True, autoincrement=True,
>key='id_')
> tag = sa.Column(sa.String())
> 
> _AutomapBase.metadata.reflect(bind=ENGINE, only=['model1'], 
> extend_existing=True)
> _AutomapBase.prepare()
> 
> row = Model1(tag='tag1')
> orm_session.add(attempt)
> orm_session.flush()
> ```
> 
> I get the exception `ArgumentError: Only one Column may be marked 
> autoincrement=True, found both id and id.` when I run the following insert:
> ```
>   File 
> "/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/orm/session.py", 
> line 2523, in flush
> self._flush(objects)
>   File 
> "/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/orm/session.py", 
> line 2664, in _flush
> transaction.rollback(_capture_exception=True)
>   File 
> "/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/util/langhelpers.py",
>  line 68, in __exit__
> compat.raise_(
>   File 
> "/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/util/compat.py", 
> line 178, in raise_
> raise exception
>   File 
> "/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/orm/session.py", 
> line 2624, in _flush
> flush_context.execute()
>   File 
> "/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/orm/unitofwork.py",
>  line 422, in execute
> rec.execute(self)
>   File 
> "/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/orm/unitofwork.py",
>  line 586, in execute
> persistence.save_obj(
>   File 
> "/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/orm/persistence.py",
>  line 239, in save_obj
> _emit_insert_statements(
>   File 
> "/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/orm/persistence.py",
>  line 1135, in _emit_insert_statements
> result = cached_connections[connection].execute(
>   File 
> "/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/engine/base.py", 
> line 1014, in execute
> return meth(self, multiparams, params)
>   File 
> "/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/sql/elements.py",
>  line 298, in _execute_on_connection
> return connection._execute_clauseelement(self, multiparams, params)
>   File 
> "/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/engine/base.py", 
> line 1108, in _execute_clauseelement
> compiled_sql = elem.compile(
>   File "", line 1, in 
>   File 
> "/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/sql/elements.py",
>  line 476, in compile
> return self._compiler(dialect, bind=bind, **kw)
>   File 
> "/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/sql/elements.py",
>  line 482, in _compiler
> return dialect.statement_compiler(dialect, self, **kw)
>   File 
> "/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/sql/compiler.py",
>  line 590, in __init__
> Compiled.__init__(self, dialect, statement, **kwargs)
>   File 
> "/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/sql/compiler.py",
>  line 319, in __init__
> self.string = self.process(self.statement, **compile_kwargs)
>   File 
> "/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/sql/compiler.py",
>  line 350, in process
> return obj._compiler_dispatch(self, **kwargs)
>   File 
> "/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/sql/visitors.py",
>  line 95, in _compiler_dispatch
> return meth(self, **kw)
>   File 
> "/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/sql/compiler.py",
>  line 2427, in visit_insert
> crud_params = crud._setup_crud_params(
>   File 
> 

[sqlalchemy] ArgumentError: Only one Column may be marked autoincrement=True, found both id and id.` when I run the following insert

2020-08-22 Thread Vitaly Kruglikov
Dear all,

I am using:
sqlalchemy==1.3.18
psycopg2==2.8.4
connection url schema: "postgresql+psycopg2://..."
postgres 10.x


My code looks like this:

```
_AutomapBase = automap.automap_base()

class Model1(_AutomapBase):
__tablename__ = 'model1"

id_ = sa.Column('id', sa.Integer, primary_key=True, autoincrement=True,
   key='id_')
tag = sa.Column(sa.String())

_AutomapBase.metadata.reflect(bind=ENGINE, only=['model1'], 
extend_existing=True)
_AutomapBase.prepare()

row = Model1(tag='tag1')
orm_session.add(attempt)
orm_session.flush()
```

I get the exception `ArgumentError: Only one Column may be marked 
autoincrement=True, found both id and id.` when I run the following insert:
```
  File 
"/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/orm/session.py", 
line 2523, in flush
self._flush(objects)
  File 
"/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/orm/session.py", 
line 2664, in _flush
transaction.rollback(_capture_exception=True)
  File 
"/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/util/langhelpers.py",
 
line 68, in __exit__
compat.raise_(
  File 
"/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/util/compat.py", 
line 178, in raise_
raise exception
  File 
"/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/orm/session.py", 
line 2624, in _flush
flush_context.execute()
  File 
"/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/orm/unitofwork.py",
 
line 422, in execute
rec.execute(self)
  File 
"/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/orm/unitofwork.py",
 
line 586, in execute
persistence.save_obj(
  File 
"/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/orm/persistence.py",
 
line 239, in save_obj
_emit_insert_statements(
  File 
"/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/orm/persistence.py",
 
line 1135, in _emit_insert_statements
result = cached_connections[connection].execute(
  File 
"/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/engine/base.py", 
line 1014, in execute
return meth(self, multiparams, params)
  File 
"/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/sql/elements.py", 
line 298, in _execute_on_connection
return connection._execute_clauseelement(self, multiparams, params)
  File 
"/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/engine/base.py", 
line 1108, in _execute_clauseelement
compiled_sql = elem.compile(
  File "", line 1, in 
  File 
"/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/sql/elements.py", 
line 476, in compile
return self._compiler(dialect, bind=bind, **kw)
  File 
"/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/sql/elements.py", 
line 482, in _compiler
return dialect.statement_compiler(dialect, self, **kw)
  File 
"/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/sql/compiler.py", 
line 590, in __init__
Compiled.__init__(self, dialect, statement, **kwargs)
  File 
"/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/sql/compiler.py", 
line 319, in __init__
self.string = self.process(self.statement, **compile_kwargs)
  File 
"/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/sql/compiler.py", 
line 350, in process
return obj._compiler_dispatch(self, **kwargs)
  File 
"/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/sql/visitors.py", 
line 95, in _compiler_dispatch
return meth(self, **kw)
  File 
"/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/sql/compiler.py", 
line 2427, in visit_insert
crud_params = crud._setup_crud_params(
  File 
"/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/sql/crud.py", 
line 64, in _setup_crud_params
return _get_crud_params(compiler, stmt, **kw)
  File 
"/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/sql/crud.py", 
line 158, in _get_crud_params
_scan_cols(
  File 
"/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/sql/crud.py", 
line 346, in _scan_cols
_append_param_insert_pk_returning(
  File 
"/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/sql/crud.py", 
line 457, in _append_param_insert_pk_returning
elif c is stmt.table._autoincrement_column or c.server_default is not 
None:
  File 
"/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/sql/schema.py", 
line 779, in _autoincrement_column
return self.primary_key._autoincrement_column
  File 
"/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/util/langhelpers.py",
 
line 883, in __get__
obj.__dict__[self.__name__] = result = self.fget(obj)
  File 
"/tmp/empower-wf-venv/lib/python3.8/site-packages/sqlalchemy/sql/schema.py", 
line 3706, in _autoincrement_column
raise exc.ArgumentError(
sqlalchemy.exc.ArgumentError: Only one Column may be marked 
autoincrement=True, found both id and id.
```

I suspect this has something to do with the combination 

[sqlalchemy] ArgumentError: Only one Column may be marked autoincrement=True, found both id and id

2020-08-21 Thread Vitaly Kruglikov
Dear all,

I am using:
sqlalchemy==1.3.18
psycopg2==2.8.4
connection url schema: "postgresql+psycopg2://..."
postgres 10.x

when I define an explicit AutomapBase-derived model for 
'sqa_global_context'  table with only the primary key, I expected that 
running `Base.metadata.reflect(bind=database.ENGINE, 
only=['sqa_global_context']); Base.prepare()` would backfill missing 
columns and relationships in that table. However, after running 
`Base.prepare(engine, reflect=True)`, the missing columns and relationships 
are not populated in my table.

My code looks like this:

```
_AutomapBase = automap.automap_base()

class Model1(_AutomapBase):
__tablename__ = 'model1"

id_ = sa.Column('id', sa.Integer, primary_key=True, autoincrement=True,
   key='id_')
tag = sa.Column(sa.String())

_AutomapBase.metadata.reflect(bind=ENGINE, only=['model1'], 
extend_existing=True)
_AutomapBase.prepare()
```

I get the exception `ArgumentError: Only one Column may be marked 
autoincrement=True, found both id and id.` when I run the following insert:
```
row = Model1(tag='tag1')
orm_session.add(attempt)
orm_session.flush()
```

I suspect this has something to do with the combination of the explicit 
definition of the `id_` column and reflection, but don't know how to fix. I 
really need to keep the explicit `id_` descriptor and shouldn't rename it 
to `id` because that's a reserved python word.

Please help. Many thanks in advance!


-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
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+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sqlalchemy/426d0281-27ee-448d-829f-72f137532fd2n%40googlegroups.com.