def encode_play(): # None of this works because all encode uses await, and you cannot call # any await method unless every def is async def # So we do have to split our database query build + ORM into both sync # and async from uvicore import db import sqlalchemy as sa from databases import Database connection = 'wiki' database = Database('mysql://*****:*****@127.0.0.1:3306/uvicore_wiki') database.connect() table = sa.Table("users", db.metadata.get(connection), sa.Column("id", sa.Integer, primary_key=True), sa.Column("name", sa.String(length=50))) #engine = db.engine('wiki') #con = db.connect() query = table.select() users = database.fetch_all(query) # for user in users: # table = User.Db.table # query = table.select() # users = con.execute(query) dd('DONE encode_play()')
class ShowsDB(object): def __init__(self): self.database = Database(url=DATABASE_URL, ssl='require', min_size=1, max_size=2) self.metadata = MetaData() self.shows = Table('shows', self.metadata, Column('show_id', Integer, primary_key=True), Column('type', String, nullable=True), Column('title', String, nullable=True), Column('director', String, nullable=True), Column('cast', String, nullable=True), Column('country', String, nullable=True), Column('date_added', Date, nullable=True), Column('release_year', Integer, nullable=True), Column('rating', String, nullable=True), Column('duration', String, nullable=True), Column('listed_in', String, nullable=True), Column('description', String, nullable=True)) def initialize(self): engine = create_engine(DATABASE_URL) self.metadata.create_all(engine) return self def connect(self): return self.database.connect() def disconnect(self): return self.database.disconnect() def execute(self, query, get='all'): if get != 'all': return self.database.fetch_one(query) return self.database.fetch_all(query) def fetch_all(self, query): return self.database.fetch_all(query)
class Database: def __init__(self, url: str): #self.url = DatabaseURL(url) self.url = url if app.is_async: from databases import Database as EncodeDatabase # NO +pymysql self.encodedb = EncodeDatabase( "mysql://*****:*****@127.0.0.1/uvicore_wiki") @app.http.on_event("startup") async def startup(): await self.encodedb.connect() @app.http.on_event("shutdown") async def shutdown(): await self.encodedb.disconnect() else: self.engine = create_engine(self.url, echo=True) from sqlalchemy import MetaData self.metadata = MetaData() def connect(self): return self.engine.connect() def fetchone(self, entity: E, query) -> E: if app.is_async: return self.encodedb.fetch_one(query=query) else: with self.connect() as con: results = con.execute(query) return entity(**results.fetchone()) def fetchall(self, entity, query) -> List[E]: if app.is_async: return self.encodedb.fetch_all(query=query) else: with self.connect() as con: results = con.execute(query) rows = [] for row in results: #rows.append(entity.User(**row)) rows.append(entity(**row)) return rows
import asyncio from databases import Database database = Database('sqlite:///example.db') results = asyncio.run(database.fetch_all(query='SELECT * FROM user')) print(results)