Advertisement
Guest User

Untitled

a guest
Nov 2nd, 2016
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.51 KB | None | 0 0
  1. # 1. Execute an INSERT statement that will insert the row with emp_name='dilbert'. The primary key column can be omitted so that it is generated automatically.
  2. ```
  3. import os
  4.  
  5. from sqlalchemy import create_engine
  6.  
  7. if os.path.exists("some.db"):
  8. os.remove("some.db")
  9. e = create_engine("sqlite:///some.db")
  10. e.execute("""
  11. CREATE TABLE employee (
  12. emp_id INTEGER PRIMARY KEY,
  13. emp_name VARCHAR
  14. )
  15. """)
  16.  
  17. e.execute("""INSERT INTO employee(emp_name) VALUES ('dilbert')""")
  18. ```
  19.  
  20. # 2. SELECT all rows from the employee table.
  21.  
  22. from sqlalchemy import create_engine
  23.  
  24. e = create_engine("sqlite:///some.db")
  25.  
  26. result = e.execute("select * from employee")
  27. for row in result:
  28. print(row)
  29.  
  30.  
  31. ```
  32. (1, 'dilbert')
  33. ```
  34.  
  35. # 1. Write a Table construct corresponding to this CREATE TABLE statement.
  36. ```
  37. from sqlalchemy import MetaData
  38. from sqlalchemy import Table, Column, ForeignKey
  39. from sqlalchemy import Integer, DateTime, Unicode
  40.  
  41. metadata = MetaData()
  42. user_table = Table('network', metadata,
  43. Column('network_id', Integer, primary_key=True),
  44. Column('created_at', DateTime, nullable=False),
  45. Column('owner_id', Integer, ForeignKey('user.id')),
  46. Column('name', Unicode(100), nullable=False)
  47. )
  48. ```
  49.  
  50. # 2. Then emit metadata.create_all(), which will emit CREATE TABLE for this table (it will skip those that already exist).
  51.  
  52. ```
  53. from sqlalchemy import MetaData, create_engine
  54. from sqlalchemy import Table, Column, ForeignKey
  55. from sqlalchemy import Integer, DateTime, Unicode, String
  56.  
  57. e = create_engine("sqlite:///some.db")
  58.  
  59. metadata = MetaData()
  60. user_table = Table('user', metadata,
  61. Column('id', Integer, primary_key=True),
  62. Column('name', String),
  63. Column('fullname', String)
  64. )
  65.  
  66. network_table = Table('network', metadata,
  67. Column('network_id', Integer, primary_key=True),
  68. Column('created_at', DateTime, nullable=False),
  69. Column('owner_id', Integer, ForeignKey('user.id')),
  70. Column('name', Unicode(100), nullable=False)
  71. )
  72.  
  73. metadata.create_all(e)
  74. ```
  75.  
  76. # 1. Using 'metadata2', reflect the "network" table in the same way we just did 'user', then display the columns (or bonus, display just the column names)
  77.  
  78. from sqlalchemy import MetaData, create_engine
  79. from sqlalchemy import Table
  80.  
  81. e = create_engine("sqlite:///some.db")
  82.  
  83.  
  84. metadata = MetaData()
  85. user_reflected = Table('network', metadata, autoload=True, autoload_with=e)
  86.  
  87. print(user_reflected.c)
  88.  
  89.  
  90. ```
  91. ['network.network_id', 'network.created_at', 'network.owner_id', 'network.name']
  92. ```
  93.  
  94. from sqlalchemy import MetaData, create_engine
  95. from sqlalchemy import Table
  96.  
  97. e = create_engine("sqlite:///some.db")
  98.  
  99. metadata = MetaData()
  100. user_reflected = Table('network', metadata, autoload=True, autoload_with=e)
  101.  
  102. for col in user_reflected.columns:
  103. print(col.name)
  104.  
  105.  
  106. ```
  107. network_id
  108. created_at
  109. owner_id
  110. name
  111. ```
  112.  
  113.  
  114. # 2. Using "inspector", print a list of all table names that include a column called "story_id"
  115.  
  116.  
  117. from sqlalchemy import inspect, create_engine
  118.  
  119. e = create_engine("sqlite:///some.db")
  120. res = []
  121. for table in inspect(e).get_table_names():
  122. for col in inspect(e).get_columns(table):
  123. if col['name'] == 'story_id':
  124. res.append(table)
  125. print(res)
  126.  
  127.  
  128. ```
  129. ['published', 'story']
  130. ```
  131.  
  132. # Produce these expressions using "user_table.c.fullname", "user_table.c.id", and "user_table.c.username": 1. user.fullname = 'ed' 2. user.fullname = 'ed' AND user.id > 5 3. user.username = 'edward' OR (user.fullname = 'ed' AND user.id > 5)
  133. ```
  134. from sqlalchemy import MetaData, Table, Column, String, Integer, and_, or_
  135. from sqlalchemy import create_engine
  136.  
  137. metadata = MetaData()
  138. user_table = Table('user', metadata,
  139. Column('id', Integer, primary_key=True),
  140. Column('username', String(50)),
  141. Column('fullname', String(50))
  142. )
  143.  
  144. engine = create_engine("sqlite://")
  145. metadata.create_all(engine)
  146.  
  147. print(user_table.c.fullname == 'ed')
  148. print(and_(user_table.c.fullname == 'ed', user_table.c.id > 5))
  149. print(or_(user_table.c.fullname == 'edward', and_(user_table.c.fullname == 'ed', user_table.c.id > 5)))
  150. ```
  151.  
  152. # 1. use user_table.insert() and "r = conn.execute()" to emit this statement: INSERT INTO user (username, fullname) VALUES ('dilbert', 'Dilbert Jones') 2. What is the value of 'user.id' for the above INSERT statement? 3. Using "select([user_table])", execute this SELECT: SELECT id, username, fullname FROM user WHERE username = 'wendy' OR username = 'dilbert' ORDER BY fullname
  153.  
  154. from sqlalchemy import MetaData, Table, Column, String, Integer, or_, select
  155. from sqlalchemy import create_engine
  156.  
  157. metadata = MetaData()
  158. user_table = Table('user', metadata,
  159. Column('id', Integer, primary_key=True),
  160. Column('username', String(50)),
  161. Column('fullname', String(50))
  162. )
  163.  
  164. engine = create_engine("sqlite://")
  165. metadata.create_all(engine)
  166. conn = engine.connect()
  167. conn.execute(user_table.insert(), [{'username': 'dilbert', 'fullname': 'Dilbert Jones'}])
  168. print(conn.execute(select([user_table.c.id])).fetchall()[0][0])
  169. print(conn.execute(
  170. select([user_table.c.id, user_table.c.username, user_table.c.fullname]).where(
  171. or_(user_table.c.username == 'wendy', user_table.c.username == 'dilbert')).order_by(
  172. user_table.c.fullname)).fetchall())
  173.  
  174.  
  175. ```
  176. 1
  177. [(1, 'dilbert', 'Dilbert Jones')]
  178. ```
  179.  
  180. # Produce this SELECT: SELECT fullname, email_address FROM user JOIN address ON user.id = address.user_id WHERE username='ed' ORDER BY email_address
  181.  
  182.  
  183. from sqlalchemy import MetaData, Table, Column, String, Integer, or_, select, ForeignKey
  184. from sqlalchemy import create_engine
  185.  
  186. metadata = MetaData()
  187. address_table = Table("address", metadata,
  188. Column('id', Integer, primary_key=True),
  189. Column('user_id', Integer, ForeignKey('user.id'),
  190. nullable=False),
  191. Column('email_address', String(100), nullable=False)
  192. )
  193. user_table = Table('user', metadata,
  194. Column('id', Integer, primary_key=True),
  195. Column('username', String(50)),
  196. Column('fullname', String(50))
  197. )
  198.  
  199. engine = create_engine("sqlite://")
  200. metadata.create_all(engine)
  201.  
  202. conn = engine.connect()
  203. conn.execute(address_table.insert(), [
  204. {"user_id": 1, "email_address": "[email protected]"},
  205. {"user_id": 1, "email_address": "[email protected]"},
  206. {"user_id": 2, "email_address": "[email protected]"},
  207. {"user_id": 3, "email_address": "[email protected]"},
  208. ])
  209. conn.execute(user_table.insert(),
  210. [{'username': 'ed', 'fullname': 'Edward'}, {'username': 'dilbert', 'fullname': 'Dilbert Jones'}])
  211. print(conn.execute(
  212. select([user_table.c.fullname, address_table.c.email_address])
  213. .select_from(user_table.join(address_table))
  214. .where(user_table.c.username == 'ed')
  215. .order_by(address_table.c.email_address)
  216. ).fetchall())
  217.  
  218.  
  219. ```
  220. [('Edward', '[email protected]'), ('Edward', '[email protected]')]
  221. ```
  222.  
  223. # 1. Execute this UPDATE - keep the "result" that's returned UPDATE user SET fullname='Ed Jones' where username='ed' 2. how many rows did the above statement update? 3. Tricky bonus! Combine update() along with select().as_scalar() to execute this UPDATE: UPDATE user SET fullname=fullname || (select email_address FROM address WHERE user_id=user.id) WHERE username IN ('jack', 'wendy')
  224.  
  225. from sqlalchemy import MetaData, Table, Column, String, Integer, or_, select, ForeignKey, update, func
  226. from sqlalchemy import create_engine
  227.  
  228. metadata = MetaData()
  229. address_table = Table("address", metadata,
  230. Column('id', Integer, primary_key=True),
  231. Column('user_id', Integer, ForeignKey('user.id'),
  232. nullable=False),
  233. Column('email_address', String(100), nullable=False)
  234. )
  235. user_table = Table('user', metadata,
  236. Column('id', Integer, primary_key=True),
  237. Column('username', String(50)),
  238. Column('fullname', String(50))
  239. )
  240.  
  241. engine = create_engine("sqlite://")
  242. metadata.create_all(engine)
  243.  
  244. conn = engine.connect()
  245. conn.execute(address_table.insert(), [
  246. {"user_id": 1, "email_address": "[email protected]"},
  247. {"user_id": 1, "email_address": "[email protected]"},
  248. {"user_id": 2, "email_address": "[email protected]"},
  249. {"user_id": 3, "email_address": "[email protected]"},
  250. ])
  251. conn.execute(user_table.insert(),
  252. [{'username': 'ed', 'fullname': 'Edward'}, {'username': 'dilbert', 'fullname': 'Dilbert Jones'}])
  253.  
  254. result = user_table.update().values(fullname="Ed Jones").where(user_table.c.username == 'ed')
  255. res = conn.execute(result)
  256. print(res.rowcount)
  257. address_sel = select([
  258. func.count(address_table.c.id)
  259. ]).where(user_table.c.id == address_table.c.user_id)
  260. result = user_table.update().values(fullname=user_table.c.fullname + address_sel.as_scalar()).where(
  261. user_table.c.username.in_({'jack', 'ed'}))
  262. res = conn.execute(result)
  263. print(res.rowcount)
  264.  
  265. ```
  266. 1
  267. 1
  268. ```
  269.  
  270. # 1. Create a class/mapping for this table, call the class Network CREATE TABLE network (network_id INTEGER PRIMARY KEY, name VARCHAR(100) NOT NULL,) 2. emit Base.metadata.create_all(engine) to create the table 3. commit a few Network objects to the database: Network(name='net1'), Network(name='net2')
  271.  
  272. ```
  273. from sqlalchemy.ext.declarative import declarative_base
  274. from sqlalchemy import Column, Integer, String, Unicode, create_engine
  275. from sqlalchemy.orm import Session
  276.  
  277. Base = declarative_base()
  278.  
  279.  
  280. class Network(Base):
  281. __tablename__ = 'network'
  282.  
  283. network_id = Column(Integer, primary_key=True)
  284. name = Column(Unicode(100), nullable=False)
  285.  
  286. def __repr__(self):
  287. return "<Network(%r, %r)>" % (
  288. self.network_id, self.name
  289. )
  290.  
  291. engine = create_engine('sqlite://')
  292. Base.metadata.create_all(engine)
  293. session = Session(bind=engine)
  294. session.add_all([
  295. Network(name='net1'),
  296. Network(name='net2')
  297. ])
  298. session.commit()
  299. ```
  300. # 1. Produce a Query object representing the list of "fullname" values for all User objects in alphabetical order. 2. call .all() on the query to make sure it works! 3. build a second Query object from the first that also selects only User rows with the name "mary" or "ed". 4. return only the second row of the Query from #3.
  301.  
  302. from sqlalchemy.ext.declarative import declarative_base
  303. from sqlalchemy import Column, Integer, String, Unicode, create_engine, and_
  304. from sqlalchemy.orm import Session
  305.  
  306. Base = declarative_base()
  307.  
  308.  
  309. class Network(Base):
  310. __tablename__ = 'network'
  311.  
  312. network_id = Column(Integer, primary_key=True)
  313. name = Column(Unicode(100), nullable=False)
  314.  
  315. def __repr__(self):
  316. return "<Network(%r, %r)>" % (
  317. self.network_id, self.name
  318. )
  319.  
  320.  
  321. class User(Base):
  322. __tablename__ = 'user'
  323.  
  324. id = Column(Integer, primary_key=True)
  325. name = Column(String)
  326. fullname = Column(String)
  327.  
  328. def __repr__(self):
  329. return "<User(%r, %r)>" % (
  330. self.name, self.fullname
  331. )
  332.  
  333.  
  334. engine = create_engine('sqlite://')
  335. Base.metadata.create_all(engine)
  336. session = Session(bind=engine)
  337.  
  338. session.add_all([
  339. Network(name='net1'),
  340. Network(name='net2'),
  341. User(name='wendy', fullname='Wendy Weathersmith'),
  342. User(name='mary', fullname='Mary Contrary'),
  343. User(name='fred', fullname='Fred Flinstone'),
  344. User(name='ed', fullname='Edward Jones')
  345. ])
  346. session.commit()
  347. print(session.query(User.fullname).filter(User.name.in_(['mary', 'fred'])).order_by(User.fullname).all()[1])
  348.  
  349. ```
  350. ('Mary Contrary',)
  351. ```
  352.  
  353. # 1. Run this SQL JOIN: SELECT user.name, address.email_address FROM user JOIN address ON user.id=address.user_id WHERE address.email_address='[email protected]' 2. Tricky Bonus! Select all pairs of distinct user names. Hint: "... ON user_alias1.name < user_alias2.name"
  354.  
  355. from sqlalchemy.ext.declarative import declarative_base
  356. from sqlalchemy import Column, Integer, String, Unicode, create_engine, and_, ForeignKey
  357. from sqlalchemy.orm import Session, relationship, aliased
  358.  
  359. Base = declarative_base()
  360.  
  361.  
  362. class Network(Base):
  363. __tablename__ = 'network'
  364.  
  365. network_id = Column(Integer, primary_key=True)
  366. name = Column(Unicode(100), nullable=False)
  367.  
  368. def __repr__(self):
  369. return "<Network(%r, %r)>" % (
  370. self.network_id, self.name
  371. )
  372.  
  373.  
  374. class User(Base):
  375. __tablename__ = 'user'
  376.  
  377. id = Column(Integer, primary_key=True)
  378. name = Column(String)
  379. fullname = Column(String)
  380.  
  381. def __repr__(self):
  382. return "<User(%r, %r)>" % (
  383. self.name, self.fullname
  384. )
  385.  
  386.  
  387. class Address(Base):
  388. __tablename__ = 'address'
  389.  
  390. id = Column(Integer, primary_key=True)
  391. email_address = Column(String, nullable=False)
  392. user_id = Column(Integer, ForeignKey('user.id'))
  393.  
  394. user = relationship("User", backref="addresses")
  395.  
  396. def __repr__(self):
  397. return "<Address(%r)>" % self.email_address
  398.  
  399.  
  400. engine = create_engine('sqlite://')
  401. Base.metadata.create_all(engine)
  402. session = Session(bind=engine)
  403.  
  404. session.add_all([
  405. Network(name='net1'),
  406. Network(name='net2'),
  407. User(name='wendy', fullname='Wendy Weathersmith'),
  408. User(name='mary', fullname='Mary Contrary'),
  409. User(name='fred', fullname='Fred Flinstone'),
  410. User(name='ed', fullname='Edward Jones'),
  411. Address(email_address='[email protected]', user_id=0),
  412. Address(email_address='[email protected]', user_id=1),
  413. Address(email_address='[email protected]', user_id=2)
  414. ])
  415. session.commit()
  416. print(session.query(User.name, Address.email_address).join(Address).filter(
  417. Address.email_address == '[email protected]').all())
  418. a1, a2 = aliased(User), aliased(User)
  419. print(session.query(a1.name, a2.name).outerjoin().filter(
  420. a1.name < a2.name).all())
  421.  
  422.  
  423. ```
  424. [('wendy', '[email protected]')]
  425. [('mary', 'wendy'), ('fred', 'wendy'), ('fred', 'mary'), ('ed', 'wendy'), ('ed', 'mary'), ('ed', 'fred')]
  426. ```
  427.  
  428. # 1. Create a class called 'Account', with table "account": id = Column(Integer, primary_key=True) owner = Column(String(50), nullable=False) balance = Column(Numeric, default=0) 2. Create a class "Transaction", with table "transaction": * Integer primary key * numeric "amount" column * Integer "account_id" column with ForeignKey('account.id') 3. Add a relationship() on Transaction named "account", which refers to "Account", and has a backref called "transactions". 4. Create a database, create tables, then insert these objects: a1 = Account(owner='Jack Jones', balance=5000) a2 = Account(owner='Ed Rendell', balance=10000) Transaction(amount=500, account=a1) Transaction(amount=4500, account=a1) Transaction(amount=6000, account=a2) Transaction(amount=4000, account=a2) 5. Produce a report that shows: * account owner * account balance * summation of transaction amounts per account (should match balance) A column can be summed using func.sum(Transaction.amount)
  429.  
  430. from sqlalchemy.ext.declarative import declarative_base
  431. from sqlalchemy import Column, Integer, String, Unicode, create_engine, and_, ForeignKey, Numeric, func
  432. from sqlalchemy.orm import Session, relationship, aliased
  433.  
  434. Base = declarative_base()
  435.  
  436.  
  437. class Account(Base):
  438. __tablename__ = 'account'
  439.  
  440. id = Column(Integer, primary_key=True)
  441. owner = Column(String(50), nullable=False)
  442. balance = Column(Numeric, default=0)
  443.  
  444. def __repr__(self):
  445. return "<Account(%r, %r, %r)>" % (
  446. self.id, self.owner, self.balance
  447. )
  448.  
  449.  
  450. class Transaction(Base):
  451. __tablename__ = 'transaction'
  452. id = Column(Integer, primary_key=True)
  453. amount = Column(Numeric)
  454. account_id = Column(Integer, ForeignKey(Account.id), nullable=False)
  455. account = relationship('Account', backref="transactions")
  456.  
  457.  
  458. engine = create_engine('sqlite://')
  459. Base.metadata.create_all(engine)
  460. session = Session(bind=engine)
  461. a1, a2 = Account(owner='Jack Jones', balance=5000), Account(owner='Ed Rendell', balance=10000)
  462. session.add_all([
  463. a1,
  464. a2,
  465. Transaction(amount=500, account=a1),
  466. Transaction(amount=4500, account=a1),
  467. Transaction(amount=6000, account=a2),
  468. Transaction(amount=4000, account=a2)
  469. ])
  470.  
  471. session.commit()
  472. accounts = session.query(Account).all()
  473. for account in accounts:
  474. owner = account.owner
  475. balance = account.balance
  476. summ = session.query(func.sum(Transaction.amount)).filter_by(account_id=account.id).all()[0][0]
  477. print("owner: " + str(owner))
  478. print("balance: " + str(balance))
  479. print("summation of transaction amounts per account: " + str(summ))
  480.  
  481.  
  482. ```
  483. owner: Jack Jones
  484. balance: 5000.0000000000
  485. summation of transaction amounts per account: 5000.0000000000
  486. owner: Ed Rendell
  487. balance: 10000.0000000000
  488. summation of transaction amounts per account: 10000.0000000000
  489. ```
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement