我正在寻找一种在 python 中使用 SQL 数据库(例如 MySQL、SQLite)而无需实际编写 SQL 的方法。示例将是这样的(伪代码):
# INSERT INTO table (firstname, lastname) VALUES ('John', 'Smith')
table.insert({'firstname':'John', 'lastname':'Smith'})
# SELECT * FROM table WHERE name='John'
results = table.select({'firstname': 'John'})
print results
# [ {'firstname':'John', 'lastname':'Smith'} ]
围绕 python 的 DB-API 的轻型包装器,或者可能是非常轻量级的 ORM,可以完成这项工作。如果它是一个 ORM,它应该允许将 namedtuple
映射到数据库,因为这几乎是我想要使用的唯一一种对象。我确定这样的东西已经存在,但我很难找到它:)
编辑 一些提议的解决方案不是我想要的:
SQL 炼金术
好:插入和选择相当简洁
不好:存储和检索的对象不是普通的 python dicts/namedtuples/任何东西(可能它们可以被做成 namedtuples,但如何做并不明显)
丑陋的:必须显式地为每个表创建一个类使得它太重量级了
class User(Base):
__tablename__ = 'users'
id = Column(Integer, Sequence('user_id_seq'), primary_key=True)
name = Column(String(50))
fullname = Column(String(50))
...
ed_user = User(name='ed', fullname='Ed Jones', password='edspassword')
session.add(ed_user)
our_user = session.query(User).filter_by(name='ed').first()
our_user
<User(name='ed', fullname='Ed Jones', password='edspassword')>
小马ORM
好:将查询编写为生成器的方式纯属天才
不好的:仍然使用自定义对象,而不是内置的 python 数据类型
丑陋的:和SQL Alchemy一样,需要为每个表创建一个类
from pony.orm import *
db = Database()
class Person(db.Entity):
name = Required(str)
age = Required(int)
p1 = Person(name='John', age=20)
commit()
persons = select(p for p in Person if p.age > 20)
最佳答案
您只需要做一些更多的工作 - 通过阅读文档。 SQLAlchemy 可能具有最简单的“数据库逆向工程”形式(称为反射),详见 here .
最简单的例子:
from sqlalchemy import *
metadata = MetaData()
engine = create_engine('mysql+mysqldb://scott:tiger@localhost/foo')
person_table = Table('person', metadata, autoload=True, autoload_with=engine)
q = person_table.insert().values(name='John', age=20)
connection = engine.connect()
connection.execute(q)
关于python - 如何在不编写 SQL 的情况下在 python 中使用 SQL 数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34504403/