Payment protectionDetails
- Revisions within the package are free.
- If you do not respond within 3 days of delivery, the work is accepted automatically.
The money is reserved when you pay and released only once you accept the work.

Example result
Code review: Python order-import script for a small online shop
What the code does
- Reads
orders.csvfrom the shop export. - For each order line, finds the product by SKU in
stock.xlsxand subtracts the quantity. - Writes the updated stock back and logs totals to
import_log.txt.
The structure is clear and functions are well named. Most issues are about input that does not look the way the script expects.
Bugs and weak spots
| # | Line | Severity | Issue |
|---|---|---|---|
| 1 | 48 | High | The same CSV can be imported twice; there is no check for already processed order IDs. This is the most likely cause of negative stock. |
| 2 | 72 | High | int(row["qty"]) crashes on empty or "2.0" values from refunded orders. |
| 3 | 95 | Medium | SKU lookup is case-sensitive: "gt-101" and "GT-101" are treated as different products. |
| 4 | 130 | Medium | The file is opened without encoding="utf-8", so product names with accents break on Windows. |
| 5 | 201 | Low | Bare except: hides real errors and makes the log useless. |
Corrected fragments
Issue 1: skip orders already imported
processed = load_processed_ids("processed_orders.txt")
for row in reader:
if row["order_id"] in processed:
continue
# ... existing logic ...
processed.add(row["order_id"])
save_processed_ids("processed_orders.txt", processed)
Why: each order is applied once, even if you run the script on the same file again.
Issue 2: read quantity safely
raw = (row.get("qty") or "").strip()
try:
qty = int(float(raw))
except ValueError:
log.warning("Order %s: bad quantity %r, skipped", row["order_id"], raw)
continue
Why: refunded or partial lines are skipped with a clear note instead of stopping the whole import.
Issue 3: normalise SKUs
sku = row["sku"].strip().upper()
Apply the same .strip().upper() when building the stock dictionary.
Style and readability
process()is 90 lines long; split it intoread_orders,apply_to_stock,write_report.- Replace magic column numbers (
row[7]) with header names.
Please test each fix on a copy of your files: we read the code but did not run it.
Client: owner of a tea shop who wrote a 310-line Python script that imports orders from a CSV export into the stock spreadsheet Problem reported: "Sometimes stock goes negative, and the script crashes on some files."
The client and all details are made up.
About this service
A query can return plausible numbers and still be wrong: a join that multiplies rows, a WHERE that drops NULLs, a LEFT JOIN quietly turned into an inner one, or a function on an indexed column that forces a full scan. We read your queries for your database engine, explain step by step what each part returns, and mark logic errors and slow spots. Corrected queries come with a note on what changed in the result and why.
What is included
- What you getA written review on the order page: what each query returns, errors and slow spots by importance, and corrected SQL for your engine. Premium adds index suggestions based on your table structure and the query plan you paste.
- Joins checkedDuplicated or lost rows
- NULL handlingFilters and aggregates that skip values
- Grouping logicGROUP BY, HAVING and window functions
- Slow spotsScans, subqueries, functions on columns
- Corrected queriesIn your engine's dialect
How it works
- 1BriefYou paste queries and table structure
- 2ReadingWe walk through each clause
- 3ReviewYou get errors, fixes and explanations
What we need from you
The queries and the CREATE TABLE statements pasted as text or screenshots, the database engine and version, what result you expect and, for slow queries, the EXPLAIN output.
We will ask you:
- Which database engine and version?
- What should the query return?
- Is the problem wrong results or slow speed?
- Roughly how many rows are in the main tables?
Compare packages
| Packages | BasicSQL up to 100 lines$15 | StandardSQL up to 400 lines$35 | PremiumUp to 1,000 lines with index advice$69 |
|---|---|---|---|
| Deadline | 1 day | 2 days | 3 days |
| Revisions | 1 | 2 | 3 |
| Lines of code | up to 100 | up to 400 | up to 1,000 |
| Corrected fragments | Yes | Yes | Yes |
| Index suggestions | No | No | Yes |
| Order Basic | Order Standard | Order Premium |
Payment protection
You pay when you order, but the money is released only for accepted work.
- Fixed priceThe package price does not change after you pay.
- The money is reservedWhen you pay, the amount is only reserved. It is released to the service once you accept the work.
- Checked before deliveryEvery result goes through a quality check before it reaches you, and you see it on the order page before accepting it.
- Free revisionsAsk for changes within your brief as many times as the package allows.
- Acceptance after 3 daysIf within 3 days of delivery you neither accept the work nor ask for changes, it is accepted automatically. If you write in the order chat after delivery, the order waits; once we answer, we may start the 3 days again and will say so in the chat.
- Redo or a full refundIf the result does not match your brief and the revisions did not fix it, or the work takes more than twice its deadline, write in the order chat: we will redo the work or refund the payment in full.
Questions and answers
Do you run the queries on my data?
No. We do not connect to your database. We read the SQL and the structure you send, so test the corrected queries on a copy before using them in production.
Should I send real data?
No need. Table structure and a few made-up sample rows are enough, and please leave out personal data.
Can you explain a query someone else wrote?
Yes. We describe what it returns clause by clause, which is often the fastest way to find why the numbers look odd.