2016-03-10 29 views
12

Ich möchte eine Tabelle mit SQLAlchemy löschen.Wie lösche ich eine Tabelle in SQLAlchemy?

Da ich immer und immer wieder teste, möchte ich die Tabelle my_users löschen, damit ich jedes Mal von vorne anfangen kann.

Bisher habe ich SQLAlchemy bin mit roher SQL durch die engine.execute() Methode auszuführen:

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

Allerdings frage ich mich, ob es eine standardisierte Möglichkeit, dies zu tun. Die einzigen, die ich finden konnte, ist drop_all(), aber es löscht alle die Struktur, die nicht nur eine bestimmte Tabelle:

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

Zum Beispiel dieses sehr einfache Beispiel gegeben. Es besteht aus einer SQLite-Infrastruktur mit einer einzigen Tabelle my_users, in der ich einige Inhalte hinzufüge.

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) 

Für diesen speziellen Fall drop_all() funktionieren würde, aber es wird von dem Moment nicht bequem sein, die ich mehr als eine Tabelle beginnen mit und ich mag die andere halten.

Antwort

19

Rufen Sie einfach drop() gegen das Tabellenobjekt. Von the docs:

Issue a DROP statement for this Table, using the given Connectable for connectivity.

In Ihrem Fall sollte es sein:

User.__table__.drop() 

Wenn Sie erhalten eine Ausnahme wie:

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 

Sie müssen den Motor weitergeben müssen:

+2

Interessant! Wenn ich jedoch eine 'User .__ Tabelle __. Drop()' hinzufüge, bekomme ich einen Fehler: 'sqlalchemy.exc.UnboundExecutionError: Das Tabellenobjekt 'my_users' ist nicht an eine Engine oder Verbindung gebunden. Die Ausführung kann nicht ohne die Ausführung einer Datenbank fortgesetzt werden. Es sieht vernünftig aus, aber ich weiß nicht, wie ich die Engine oder die Sitzung dafür verwenden soll. – fedorqui

+3

@fedorqui Versuchen Sie, übergeben Sie die Engine als Argument zu fallen(), und lassen Sie mich wissen – daveoncode

+5

Oh Mann 'User .__ Tabelle __. Drop (Engine)' machte es, vielen Dank! – fedorqui

1

Im Folgenden finden Sie Beispielcode Sie in ipython ausführen kann auf Postgres das Erstellen und Löschen einer Tabelle testen

from sqlalchemy import * # imports all needed modules from sqlalchemy 

engine = create_engine('postgresql://python:[email protected]/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 

Sie können meinen Artikel auch mit diesem gleichen Beispiel und Screenshots auf Wordpress Vorschau: oscarvalles.wordpress. com (Suche nach SQL Alchemy).

Verwandte Themen