Comment supprimer une table en SQLAlchemy?

je veux supprimer une table en utilisant SQLAlchemy.

comme je teste encore et encore, je veux supprimer le tableau my_users pour que je puisse recommencer à zéro à chaque fois.

Jusqu'à présent J'utilise SQLAlchemy pour exécuter du SQL brut à travers le moteur.execute () méthode:

sql = text('DROP TABLE IF EXISTS my_users;')
result = engine.execute(sql)

cependant, je me demande s'il y a une façon standard de le faire. Le seul que j'ai pu trouver est drop_all(), mais il supprime toute la structure, pas un seul tableau spécifique:

Base.metadata.drop_all(engine)   # all tables are deleted

Par exemple, dans cet exemple très simple. Il se compose d'une infrastructure SQLite avec une seule table my_users dans lequel j'ajoute du contenu.

from sqlalchemy import create_engine, Column, Integer, String, text
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine('sqlite://', echo=False)
Base = declarative_base()

class User(Base):
    __tablename__ = "my_users"

    id = Column(Integer, primary_key=True)
    name = Column(String)

    def __init__(self, name):
        self.name = name

# Create all the tables in the database which are
# defined by Base's subclasses such as User
Base.metadata.create_all(engine)

# Construct a sessionmaker factory object
session = sessionmaker()

# Bind the sessionmaker to engine
session.configure(bind=engine)

# Generate a session to work with
s = session()

# Add some content
s.add(User('myname'))
s.commit()

# Fetch the data
print(s.query(User).filter(User.name == 'myname').one().name)

Pour ce cas spécifique, drop_all() fonctionnerait, mais il ne sera pas commode à partir du moment où je commence à avoir plus d'une table et je veux garder les autres.

18
demandé sur fedorqui 2016-03-10 17:01:07

3 réponses

appel drop() contre l'objet table. À partir de la documentation:

émettre une déclaration de chute pour cette Table, en utilisant le Connectable donné pour la connectivité.

Dans votre cas, il devrait être:

User.__table__.drop()

Si vous obtenez une exception de la forme:

sqlalchemy.exc.UnboundExecutionError: Table object 'my_users' is not bound to an Engine or Connection. Execution can not proceed without a database to execute against

vous devez passer le moteur:

User.__table__.drop(engine)
28
répondu daveoncode 2017-07-05 10:43:14

Alternative à l'appel de cls.__table__.drop(your_engine), vous pouvez essayer ceci:

Base.meta.drop_all(bind=your_engine, tables=[User.__table__])

cette méthode ainsi que la méthode create_all() acceptent un argument optionnel 'tables', qui prend un itérateur de sqlalchemy.SQL.schéma.Des instances de Table.

Vous pouvez contrôler les tables à être créées ou supprimées de cette façon.

4
répondu WeiHao 2018-04-04 06:20:46

ci-dessous est un exemple de code que vous pouvez exécuter dans iPython pour tester la création et la suppression d'une table sur Postgres

from sqlalchemy import * # imports all needed modules from sqlalchemy

engine = create_engine('postgresql://python:python@127.0.0.1/production') # connection properties stored

metadata = MetaData() # stores the 'production' database's metadata

users = Table('users', metadata,
Column('user_id', Integer),
Column('first_name', String(150)),
Column('last_name', String(150)),
Column('email', String(255)),
schema='python') # defines the 'users' table structure in the 'python' schema of our connection to the 'production' db

users.create(engine) # creates the users table

users.drop(engine) # drops the users table

Vous pouvez également prévisualiser mon article sur Wordpress avec ce même exemple et screenshots: oscarvalles.wordpress.com (recherche de SQL Alchemy).

2
répondu oscarvalles 2017-07-04 16:44:57