[Python] SQLAlchemy AttributeError: 'str' object has no attribute 'connect'

Discussão em 'Python' iniciado por Stack, Novembro 30, 2024.

  1. Stack

    Stack Membro Participativo

    I'm trying to populate a database with Python and SQLAlchemy using the same syntax as I've used in previous projects, but now I'm getting this error:

    Traceback (most recent call last):
    File "/home/vacosti/scraper_v2/populate_db.py", line 16, in <module>
    with Session(os.environ.get('DATABASE_URI'), future=True) as session, session.begin():
    File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/engine/util.py", line 147, in __exit__
    with util.safe_reraise():
    File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__
    raise exc_value.with_traceback(exc_tb)
    File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/engine/util.py", line 145, in __exit__
    self.commit()
    File "<string>", line 2, in commit
    File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go
    ret_value = fn(self, *arg, **kw)
    File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 1313, in commit
    self._prepare_impl()
    File "<string>", line 2, in _prepare_impl
    File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go
    ret_value = fn(self, *arg, **kw)
    File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 1288, in _prepare_impl
    self.session.flush()
    File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 4352, in flush
    self._flush(objects)
    File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 4487, in _flush
    with util.safe_reraise():
    File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__
    raise exc_value.with_traceback(exc_tb)
    File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 4448, in _flush
    flush_context.execute()
    File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/unitofwork.py", line 466, in execute
    rec.execute(self)
    File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/unitofwork.py", line 642, in execute
    util.preloaded.orm_persistence.save_obj(
    File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/persistence.py", line 60, in save_obj
    for (
    File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/persistence.py", line 223, in _organize_states_for_save
    for state, dict_, mapper, connection in _connections_for_states(
    File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/persistence.py", line 1753, in _connections_for_states
    connection = uowtransaction.transaction.connection(base_mapper)
    File "<string>", line 2, in connection
    File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go
    ret_value = fn(self, *arg, **kw)
    File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 1039, in connection
    return self._connection_for_bind(bind, execution_options)
    File "<string>", line 2, in _connection_for_bind
    File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go
    ret_value = fn(self, *arg, **kw)
    File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 1175, in _connection_for_bind
    conn = self._parent._connection_for_bind(
    File "<string>", line 2, in _connection_for_bind
    File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go
    ret_value = fn(self, *arg, **kw)
    File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind
    conn = bind.connect()
    AttributeError: 'str' object has no attribute 'connect'


    My table definition is the following:

    from sqlalchemy import Column, Integer, String, Float, LargeBinary
    from sqlalchemy.orm import declarative_base

    Base = declarative_base()

    class Product(Base): # type: ignore
    __tablename__ = 'products'
    id = Column(Integer, primary_key=True) #as per the docs The default value is the string "auto", which indicates that a single-column (i.e. non-composite) primary key that is of an INTEGER type with no other client-side or server-side default constructs indicated should receive auto increment semantics automatically.
    external_id = Column(String, nullable=False, unique=True, index=True)
    description = Column(String, nullable=False, index=True)
    udescription = Column(String, nullable=False, index=True)
    price = Column(Float, nullable=False)
    image = Column(LargeBinary)




    My code to populate the database is the following:

    import os
    import json
    import codecs
    from sqlalchemy.orm import Session

    from database.tables import Product

    from pathlib import Path
    CURRENT_DIR = Path(__file__).parent

    products = json.loads(codecs.open(os.path.join(CURRENT_DIR,'data/products.json')).read())

    for product in products:
    with Session(os.environ.get('DATABASE_URI'), future=True) as session, session.begin():
    productORM = Product(external_id=product['product_id'], description=product['description'], udescription=product['udescription'], price=product['price'])
    session.add(productORM)


    About the syntax with Session(...) as session, session.begin():, the docs says I can do so.

    What could be the problem in this case?

    Continue reading...

Compartilhe esta Página